首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在BATS测试中如何激活Bash函数中的ssh-帐户?

在BATS测试中如何激活Bash函数中的ssh-帐户?
EN

Stack Overflow用户
提问于 2021-11-18 11:37:31
回答 2查看 159关注 0票数 0

上下文

作为使用BATS进行测试的Bash脚本的一部分,我注意到当我运行一个激活ssh帐户的函数时,我的测试不会终止。

代码

下面的函数假设/home/<username>/.ssh/中存在私有和公共ssh密钥对。如果我使用source src/the_bash_script.sh && activate_ssh_account <my_git_username>手动运行它,它会工作,并表示为Identity added: /home/name/.ssh/<my_git_email>

代码语言:javascript
复制
#!/bin/bash
# Activates/enables the ssh for 
activate_ssh_account() {
    git_username=$1
    eval "$(ssh-agent -s)"
    ssh-add ~/.ssh/"$git_username"
}

但是,当它从测试中运行时:

代码语言:javascript
复制
#!./test/libs/bats/bin/bats
load 'libs/bats-support/load'
load 'libs/bats-assert/load'
# https://github.com/bats-core/bats-file#Index-of-all-functions
load 'libs/bats-file/load'
# https://github.com/bats-core/bats-assert#usage
load 'assert_utils'

source src/the_bash_script.sh


@test "Check if ssh-account is activated after activating it." {
    activate_ssh_account "some_git_username"
    assert_equal "Something" "Something_else"
}

它无限期地挂着。

问题

如何激活ssh帐户而不导致BATS测试无限期挂起?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-22 17:23:09

测试无限期挂起,因为BATS等待ssh-agent终止(在执行eval "$(ssh-agent -s)"行后在后台运行)。更确切地说,BATS等待文件描述符3被关闭(ssh-agent正在打开该文件描述符)。

因此,可以通过实现文档中提到的解决方法或杀死ssh-agent来解决这一问题。

文档解决方案:

代码语言:javascript
复制
#!/bin/bash
# Activates/enables the ssh for 
activate_ssh_account() {
    git_username=$1
    eval "$(ssh-agent -s 3>&-)"
    ssh-add ~/.ssh/"$git_username"
}

这关闭了fd 3的ssh-agent和BATS将不再挂起。请注意,这使得ssh-agent在后台运行,即使在BATS退出之后也是如此。从你的问题上看,这是否是想要的还不清楚。如果不是,请使用下面的替代方法。

ssh-agent**:** Kill

activate_ssh_account添加清理陷阱

代码语言:javascript
复制
#!/bin/bash
# Activates/enables the ssh for 
activate_ssh_account() {
    trap "trap - RETURN; kill \$SSH_AGENT_PID" RETURN
    git_username=$1
    eval "$(ssh-agent -s)"
    ssh-add ~/.ssh/"$git_username"
}

当函数退出并使用由ssh-agent导出的pid (即变量SSH_AGENT_PID)终止eval "$(ssh-agent -s)"时,就会执行这个陷阱。

如果您出于某种原因不想使用陷阱,这也会奏效:

代码语言:javascript
复制
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
    git_username=$1
    eval "$(ssh-agent -s)"
    result=0
    ssh-add ~/.ssh/"$git_username" || result=$?
    kill $SSH_AGENT_PID
    return $result
}

请注意,||构造是必要的,因为BATS将在命令失败后停止执行函数的代码(也就是说,如果没有||,如果ssh-add失败,kill将不会被执行)。

另外,要实际测试activate_ssh_account是否成功或失败,您应该使用assert_success而不是assert_equal (除非在您的问题中遗漏了更多的代码)。

票数 2
EN

Stack Overflow用户

发布于 2021-11-22 00:11:12

我从未使用过BATS,但通过阅读文档,我可以说有一个用于共享公共代码的特定命令。但是,您可能需要指定完整的路径:

load**:共享公共代码** 您可能希望在多个测试文件之间共享公共代码。Bats包括一个方便的加载命令,用于相对于当前测试文件的位置获取Bash源文件。例如,如果您在test/foo.bats中进行了Bats测试,则命令 load test_helper 将在您的测试文件中提供脚本test/ test _helper.bash。这对于共享函数来设置您的环境或加载固定装置非常有用。

Option1:

试着替换

代码语言:javascript
复制
source src/the_bash_script.sh

使用

代码语言:javascript
复制
load '/full/path/to/src/the_bash_script.sh'

备选案文2:

尝试在@test中添加资源

代码语言:javascript
复制
@test "Check if ssh-account is activated after activating it." {
    source /full/path/to/src/the_bash_script.sh
    activate_ssh_account "some_git_username"
    assert_equal "Something" "Something_else"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70019172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档