如何执行使用此处doc的所有脚本参数?

时间:2015-08-20 14:20:14

标签: bash shell heredoc

我有一个简单的脚本,我在整个代码库中使用它,称为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时,有一些特定的东西,例如密钥认证和管理权限,根本不起作用。

1 个答案:

答案 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;用这样的东西