ssh与Linux命令区别,linux – ssh命令引用有什么区别?

博客探讨了SSH如何使用参数连接并传递命令到远程shell,特别是`ssh josh-play 'bash -c 'cd /tmp; pwd''`的例子。解释了在不同shell环境下,命令如何执行以及参数传递的细节,包括bash的`printf %q`用于生成安全的引用形式,以避免特殊字符问题。同时指出,由于命令行语法引号的丢失,某些操作如`cd`不会在预期的shell环境中持久化。
摘要由CSDN通过智能技术生成

这里要理解的是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 – / tmp是$1,但脚本已经通过作为cd的参数永远不会取消引用该变量)但是由ssh隐式调用的sh.

如果你知道你的远程sh是由bash或ksh提供的 – 一个支持$”扩展的shell – 你可以对任意argv数组执行以下操作(在本例中为bash,-c,cd / 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"

上面的警告是,如果您的参数列表可以包含换行符或隐藏字符,则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' <<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值