调用shell“;资料来源;通过ssh
[我将使用调用shell“;资料来源;通过ssh,ssh,sh,Ssh,Sh,[我将使用/dev/null来说明这个问题。如果这让您感到困扰,只需将其替换为任何其他shell初始化文件,例如/etc/profile] 我试图在一个由ssh调用的shell中调用source。 以下工作: host$ source /dev/null host$ sh -c 'source /dev/null' 但以下几点失败了: host$ ssh localhost sh -c 'source /dev/null' /dev/null: line 0: source: filename
/dev/null
来说明这个问题。如果这让您感到困扰,只需将其替换为任何其他shell初始化文件,例如/etc/profile
]
我试图在一个由ssh
调用的shell中调用source
。
以下工作:
host$ source /dev/null
host$ sh -c 'source /dev/null'
但以下几点失败了:
host$ ssh localhost sh -c 'source /dev/null'
/dev/null: line 0: source: filename argument required
source: usage: source filename [arguments]
但是如果我在shell中使用source
第二个命令,那么它可以工作:
host$ ssh localhost sh -c 'echo; source /dev/null'
问题是为什么我不能通过ssh调用源代码作为shell中的第一个命令?如何正确地做到这一点?(还有一个额外的答案,当它是第二个命令时,它为什么工作?
[而且,source
命令将不是唯一调用的命令;这只是我在同一ssh命令上调用其他命令之前的一项要求。]您的引用不完整
sh-c'source/dev/null'
调用一个新的shell并向其传递两个参数,第一个是选项(-c
),第二个是操作-c
的命令字符串
ssh localhost sh-c'source/dev/null'
调用ssh在localhost上启动shell。这个新shell被传递了一个包含4单词的命令——实际上,单引号被ssh删除。此外壳程序适时启动第二个外壳程序并将其传递给3参数。在这种情况下,-c
仅接收源
作为命令字符串
您需要额外的报价来替换ssh剥离的报价。例如:
ssh localhost "sh -c 'source /dev/null'"
原因ssh localhost sh-c'echo;source/dev/null'
看来有效的方法是ssh向它启动的shell传递了两个命令:sh-c echo
(然后退出),然后是source/dev/null
想象一下将ssh localhost
替换为echo
并查看哪些引号消失可能会有所帮助
报告说:
ssh localhost "sh -c 'source /dev/null'"
sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]...
command_string [command_name [argument...]]
-c Read commands from the command_string operand. Set the value
of special parameter 0 (see Special Parameters) from the value
of the command_name operand and the positional parameters ($1,
$2, and so on) in sequence from the remaining argument
operands. No commands shall be read from the standard input.