当前位置: 首页 > 面试题库 >

ssh命令引用有什么区别?

蔡弘扬
2023-03-14
问题内容

这些命令如何导致不同的输出?

⋊> 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从未运行过。

传递给外壳程序的句法引号完全丢失,并且pwd不是由bash您手动触发的调用(在此用法中,该调用只是在cd没有任何参数的情况下调用了/tmpin)$1,而是作为参数传递给cd从不取消引用的脚本该变量),但由shssh隐式调用。

如果你知道你的遥控器sh是由bash或ksh的提供-壳配套的$''延伸-你可以做任意argv数组以下(在这种情况下bash-ccd /tmp; pwd):

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

# pass that through to be run by the remote sh -c
ssh josh-play "$rmt_cmd"

上面的警告是,如果您的参数列表可以包含换行符或隐藏的字符,则printf %qbash或ksh可以以不能保证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"


 类似资料:
  • 我发现了一个结果 alpha命令和beta命令有什么区别?

  • 我刚刚安装了Phonegap的第一个time.confuses我的事实是,一些文档正在使用命令“phonegap”和一些“cordova”是电话间隙和cordovan命令之间的区别?我需要使用哪个命令来创建phonegap应用程序?请任何人都可以帮助我?

  • 问题内容: Dockerfile中的和命令之间有什么区别,何时可以在另一个之上使用? COPY指令将从以下位置复制新文件并将其添加到容器的文件系统中: ADD指令将从中复制新文件并将其添加到位于path的容器的文件系统中。 问题答案: 您应该查看和文档以获取有关其行为的更详细描述,但简而言之,主要区别在于可以做的还不止: 允许成为网址 参考下面的评论, 文档指出: 如果是以公认的压缩格式(身份,g

  • Dockerfile中的和命令之间有什么区别?什么时候我会使用一个命令而不是另一个命令? COPY指令将从复制新文件,并将它们添加到路径的容器文件系统中 ADD指令将从复制新文件,并将它们添加到路径的容器文件系统中。

  • 问题内容: 我已经从nodejs.org上提供的tar文件中解压了node.js,但是当我尝试通过node命令执行我的js程序时,什么也没发生,但是另一方面,nodejs命令运行会执行该文件。 所以我的问题是 ,node命令和nodejs命令之间 有什么 区别, 因为我 不是从源代码构建的,这 会影响我的程序 。 我的原因就是这种差异。 问题答案: 这在很大程度上取决于许多因素。主要是,要看是什么

  • 我有这个命令来编译我的程序。 我创建了以下makefile。 如果从terminal运行该命令将成功,但make将失败。 它将失败,并出现错误 该文件应该在命令中使用导入。 我认为Makefile中的命令执行起来很像bash脚本。 在bash中运行命令和在Makefile中运行命令有什么区别?