我需要管道多个ssh命令才能在远程计算机上运行命令。 命令在单个ssh下正常工作,但在管道ssh之后没有。 E.g
ssh abc@remotemachine1.com "a=hello ; echo \$a"
回复你好 但
ssh abc@remotemachine1.com ssh abc@remotemachine2.com"a=hello ; echo \$a"
不产生输出。
类似地:
ssh abc@remotemachine1.com "mountedDir=\$(df \tmp | grep -vi filesystem | rev | cut -d ' ' -f 1); mount | grep -w \$mountedDir"
正常工作以产生以下输出:
/dev/sda2 on / type xfs (rw,relatime,attr2,inode64,noquota)
但
ssh abc@remotemachine1.com ssh abc@remotemachine2.com "mountedDir=\$(df \tmp | grep -vi filesystem | rev | cut -d ' ' -f 1); mount | grep -w \$mountedDir"
抛出以下错误:
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
注意:从我的机器到remotemachine1.com以及从remotemachine1.com到remotemachine2.com建立无密码ssh
答案 0 :(得分:0)
ssh abc@remotemachine1.com ssh abc@remotemachine2.com"a=hello ; echo \$a"
看起来不对。如果要从remotemachine1跳转到remotemachine2,请查看ssh config中的ProxyJump
选项。您可以使用ssh二进制文件的-o
选项在命令行上提供它。
答案 1 :(得分:0)
如果由于某种原因您不想修改ssh_config
文件,则需要使用ssh -t
,这将导致在机器2上分配真正的TTY,如下所示:
ssh -t abc@remotemachine1.com ssh abc@remotemachine2.com"a=hello ; echo \$a"
要小心,因为使用此方法意味着所有SSH登录身份验证过程都将在remotemachine1.com
发生,因此如果您有安全问题,最好使用@allo的答案。
答案 2 :(得分:0)
在我添加了多个转义字符
之后,它终于奏效了ssh abc@remotemachine1.com " ssh abc@remotemachine2.com \" a=hello ;echo \\\$a \" "
并且
ssh abc@remotemachine1.com " ssh abc@remotemachine2.com \" mountedDir=\\\$(df /var | grep -vi filesystem | rev | cut -d ' ' -f 1); mount | grep -w \\\$mountedDir | grep -vi 'noexec' \" "