bash - ssh bash -c 退出状态不传播

标签 bash ssh

<分区>

根据 man sshthis previous answer , ssh 应该传播它在远程服务器上运行的任何进程的退出状态。我好像发现了一个莫名其妙的异常!

$ ssh myserver exit 34 ; echo $?
34

好...

$ ssh myserver 'exit 34' ; echo $?
34

好...

$ ssh myserver bash -c 'exit 34' ; echo $?
0

什么?!?

$ ssh myserver
ubuntu@myserver $ bash -c 'exit 34' ; echo $?
34

所以问题似乎不是孤立的 ssh 或 bash -c,而是它们的组合并不像我预期的那样表现。

我正在设计一个在远程计算机上运行的脚本,该脚本需要采用在客户端计算的参数列表。为了争论,假设如果任何参数不是远程服务器上的文件,它就会失败:

ssh myserver bash -c '
    for arg ; do
        if [[ ! -f "$arg" ]] ; then
            exit 1
        fi
    done
' arg1 arg2 ...

我怎样才能运行这样的东西并有效地检查它的返回状态?上面的测试似乎表明我不能。

最佳答案

问题是引用丢失了。 ssh 只是连接参数,不会重新引用它们,因此您实际在服务器上执行的命令是:

bash -c exit 34

-c选项只接受一个参数,而不是所有剩余的参数,所以它只是执行exit34 被忽略。

如果这样做,您会看到类似的效果:

ssh myserver bash -c 'echo foo'

它只会回显一个空行,而不是 foo

你可以通过给 ssh 一个参数来修复它:

ssh myserver "bash -c 'exit 34'"

或者通过双引号:

ssh myserver bash -c "'exit 34'"

关于bash - ssh bash -c 退出状态不传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372302/

相关文章:

amazon-web-services - 创建具有多个 key 对的 ec2 实例

jenkins - 当使用 “sudo su”时,jenkins通过ssh挂起执行shell

linux - 删除两个句子对齐文件中的重复行,Linux

Ruby 转义 ARGV 参数或字符串作为 shell 命令的参数

linux - Bash 中 ${} 和 $() 的区别

java - 如何在 String 中获取 jsch shell 命令输出

ssh - 允许 CI 访问私有(private) BitBucket 存储库

git - 同一设备上的多个 SSH key

linux - 如何正确使用测试命令?

c - 为什么 bash 不打印 PS1 变量?