在嵌套的ssh中使用bash shell脚本中的命令行参数

3

我试图在Bash shell脚本中使用通过命令行传递的$1、$2变量。我正在ssh调用中使用这些变量。但是似乎ssh内部的变量没有被替换,而外部的变量被替换了。有什么解决方法吗?以下是代码:

#!/bin/bash

ssh -t "StrictHostKeyChecking=no" -i  $1 user@ip<<'EOF1'

ssh -t -i $1 user2@ip2 <<'EOF2'

exit
EOF2

exit
EOF1

这里第一个$1被替换了,但第二个没有。它基本上是无密码身份验证的键名。


如果你想得到比我已经提供的更好的答案,你需要提出一个更好的问题。也许展示一下能够重现问题的代码会有帮助? - Charles Duffy
2个回答

6

使用printf %q生成一个可供eval安全使用的字符串版本的参数列表:

# generate a string which evals to list of command-line parameters
printf -v cmd_str '%q ' "$@"

# pass that list of parameters on the remote shell's command line
ssh "$host" "bash -s $cmd_str" <<'EOF'
  echo "This is running on the remote host."
  echo "Got arguments:"
  printf '- %q\n' "$@"
EOF

针对您所需要做的事情,最好的做法可能是使用ProxyCommand - 请参阅相关文档,并通过代理转发让您的私有密钥暴露出来,而不是将其存在跳板主机的磁盘上。即便如此,也很容易采用上面给出的答案来适应问题中的代码:

#!/bin/bash
printf -v args '%q ' "$@"
echo "Arguments on original host are:"
printf '- %q\n' "$@"
ssh -t "StrictHostKeyChecking=no" -i "$1" user@ip "bash -s $args" <<'EOF1'
  printf -v args '%q ' "$@" 
  echo "Arguments on ip1 are:"
  printf '- %q\n' "$@"
  ssh -t -i "$1" user2@ip2 "bash -s $args" <<'EOF2'
    echo "Arguments on ip2 are:"
    printf '- %q\n' "$@"
EOF2
EOF1

@user3780835,...相应地扩展。 - Charles Duffy
谢谢查尔斯抽出时间。我也会研究ProxyCommand。 - Oliver Blue

1

绝对正确——这就是为什么我在回答中提到了它[附有关于OpenSSH Cookbook的相关章节链接],因为当OP扩展他们的问题以明确他们正在做什么时,我提到了它。更加明确——就像你在这里所做的一样——并不会有任何伤害。 - Charles Duffy
嗨Charles/Chepner,是否可能ip2的密钥在我的主服务器上而不是ip1上?(尽管仅通过ip1可以登录到ip2) - Oliver Blue
如果你在本地机器上运行了一个 ssh-agent 并且使用 -A 选项启用了代理转发 (ssh -A -o ProxyCommand...),那就应该可以了。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接