Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Linux ssh命令引用有什么区别?_Linux_Bash_Ssh_Quotes_Quoting - Fatal编程技术网

Linux ssh命令引用有什么区别?

Linux ssh命令引用有什么区别?,linux,bash,ssh,quotes,quoting,Linux,Bash,Ssh,Quotes,Quoting,这些命令如何产生不同的输出 ⋊> ssh host bash -c 'cd /tmp; pwd' /home/manu ⋊> ssh host "bash -c 'cd /tmp; pwd'" /tmp 对一个类似问题的答复指出: 尾随参数组合成单个字符串,作为远程计算机上登录shell的-c选项的参数传递给 如果是*我可以理解这一点,但在本例中,哪个部分将在本地进行评估?另外,bash命令之前的--也没有帮助。这里要理解的是ssh只是将其参数串联起来(与$*的方式相同),并将串联

这些命令如何产生不同的输出

⋊> ssh host bash -c 'cd /tmp; pwd'
/home/manu
⋊> ssh host "bash -c 'cd /tmp; pwd'"
/tmp
对一个类似问题的答复指出:

尾随参数组合成单个字符串,作为远程计算机上登录shell的-c选项的参数传递给


如果是
*
我可以理解这一点,但在本例中,哪个部分将在本地进行评估?另外,bash命令之前的
--
也没有帮助。

这里要理解的是
ssh
只是将其参数串联起来(与
$*
的方式相同),并将串联的字符串传递给
sh-c


因此,在以下情况下:

ssh josh-play bash -c 'cd /tmp; pwd'
…ssh运行:

sh -c 'bash -c cd /tmp; pwd'
…因此,sh运行:

bash -c cd /tmp
pwd
…正如您可以自己测试的那样,
bash-c cd/tmp
没有太多有用的功能(它运行的脚本文本只包含
cd
/tmp
存储为参数,但脚本文本从不读取它的参数,这就没有意义了)。此外,只要退出
bash
,我们就回到了父
sh
进程,在该进程中,
cd
从未运行过

传递到外壳的语法引号完全丢失,手动触发的
bash
不会调用
pwd
(在这种用法中,它只调用
cd
而不带任何参数--
/tmp
$1
中,但作为参数传递给
cd
的脚本从不取消引用该变量),而是通过ssh隐式调用的
sh


如果您知道您的远程
sh
是由bash或ksh(一个支持
$'
扩展的shell)提供的,那么您可以对任意argv数组执行以下操作(在本例中,
bash
-c
cd/tmp;pwd
):

上面需要注意的是,如果参数列表可以包含换行符或隐藏字符,则bash或ksh中的
printf%q
可以以POSIX sh不能保证读取的形式对其进行转义。要避免这种情况,请执行以下操作:

# ask your shell to generate an eval-safe quoted form of your argument list
printf -v rmt_cmd '%q ' bash -c 'cd /tmp; pwd'

# ...and use bash to evaluate that quoted form.
ssh josh-play 'exec bash -s' <<<"$rmt_cmd"
#要求shell生成参数列表的eval-safe引用形式
printf-v rmt_cmd'%q'bash-c'cd/tmp;pwd'
#…并使用bash对引用的表单求值。

ssh-josh播放“exec bash-s”这里要理解的是
ssh
只是将其参数串联起来(与
$*
的方式相同),并将串联的字符串传递给
sh-c


因此,在以下情况下:

ssh josh-play bash -c 'cd /tmp; pwd'
…ssh运行:

sh -c 'bash -c cd /tmp; pwd'
…因此,sh运行:

bash -c cd /tmp
pwd
…正如您可以自己测试的那样,
bash-c cd/tmp
没有做太多有用的事情(它运行的脚本文本只包含
cd
/tmp
存储为参数,但脚本文本从不读取它的参数,这就没有意义了)。此外,只要退出
bash
,我们就回到了父
sh
进程,在该进程中,
cd
从未运行过

传递到外壳的语法引号完全丢失,手动触发的
bash
不会调用
pwd
(在这种用法中,它只调用
cd
而不带任何参数--
/tmp
$1
中,但作为参数传递给
cd
的脚本从不取消引用该变量),而是通过ssh隐式调用的
sh


如果您知道您的远程
sh
是由bash或ksh(一个支持
$'
扩展的shell)提供的,那么您可以对任意argv数组执行以下操作(在本例中,
bash
-c
cd/tmp;pwd
):

上面需要注意的是,如果参数列表可以包含换行符或隐藏字符,则bash或ksh中的
printf%q
可以以POSIX sh不能保证读取的形式对其进行转义。要避免这种情况,请执行以下操作:

# ask your shell to generate an eval-safe quoted form of your argument list
printf -v rmt_cmd '%q ' bash -c 'cd /tmp; pwd'

# ...and use bash to evaluate that quoted form.
ssh josh-play 'exec bash -s' <<<"$rmt_cmd"
#要求shell生成参数列表的eval-safe引用形式
printf-v rmt_cmd'%q'bash-c'cd/tmp;pwd'
#…并使用bash对引用的表单求值。

ssh-josh play'exec bash-s'看到这篇帖子:@codefrester,…尽管我认为这应该得到一个超出
sh-c
的答案,因为这肯定是一个与其他场景相关的问题。看到这篇帖子:@codefrester,…尽管我认为这应该得到一个超出
sh-c
的答案,因为这确实是一个值得关注的问题与其他场景相关。