Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用shell“;资料来源;通过ssh_Ssh_Sh - Fatal编程技术网

调用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.