我有一个简单的脚本,我在整个代码库中使用它,称为sshpass
。
#!/bin/bash
expect << EOF
spawn $@
expect {
"*assword" {
send "$SSHPASS\n"
}
}
expect eof
EOF
我目前使用此脚本的方式是这样的 -
./sshpass scp archive.tgz $SERVER:$DIR
当SSH命令是单行时,这非常有效。我的问题是当我尝试通过使用此处doc的sshpass
执行命令时。
./sshpass ssh $user@$server /bin/bash << EOF
echo "do this..."
echo "do that..."
echo "and the other..."
EOF
上述操作失败,因为$@
仅解析ssh $user@$server /bin/bash
。
关于我如何处理SSH身份验证,请不要发表评论。当被迫使用Cygwin时,有一些特定的东西,例如密钥认证和管理权限,根本不起作用。
答案 0 :(得分:5)
heredoc将替换你的脚本的stdin。如果您希望将其作为参数进行访问,请使用命令替换,如
./sshpass ssh $user@$server /bin/bash $(cat << EOF
echo "do this..."
echo "do that..."
echo "and the other..."
EOF
)
虽然这可能不会最终完成你想要的,因为它会传递每个单词作为它自己的位置参数,所以你将会运行
ssh $user@$server echo "do this..." echo "do that..." echo "and the other..."
将有第一个echo将所有其余的作为参数获取。你会在每个命令的末尾都需要半冒号,并且在整个事情中都有引号,所以你不能在远程执行某些操作,而在本地执行某些操作。所以我应该推荐它:
./sshpass ssh $user@$server /bin/bash "$(cat << EOF
echo 'do this...';
echo 'do that...';
echo 'and the other...'
EOF
)"
但这仍然给我一种不安的感觉,因为它很容易做错了#34;用这样的东西