1

我正在尝试通过 ssh 在远程计算机上执行命令,并且我需要脚本等到提供 ssh 密码(如有必要)。这是我的代码片段:

ssh -T ${remote} << EOF
if [ ! -d $HOME/.ssh ]; then
    mkdir $HOME/.ssh
    touch $HOME/.ssh/authorized_keys
    chmod 0600 $HOME/.ssh/authorized_keys
fi;
EOF

问题是,EOF 之间的命令开始在本地计算机上执行,而无需等待提供通行证。在继续脚本之前有什么方法可以等待通过吗?

4

1 回答 1

3

这很简单:

ssh -T ${remote} << 'EOF'
if [ ! -d $HOME/.ssh ]; then
        `mkdir $HOME/.ssh`
        `touch $HOME/.ssh/authorized_keys`
        `chmod 0600 $HOME/.ssh/authorized_keys`
else
EOF

注意周围的'单引号EOF

但我建议您使用$( )表单而不是反引号:反引号 (`)

用于旧式命令替换,例如

foo=`command`

foo=$(command)

建议使用语法。$() 内的反斜杠处理不那么令人惊讶,并且 $() 更容易嵌套。见http://mywiki.wooledge.org/BashFAQ/082


如果您需要传递变量:

var=42
ssh -T ${remote} << EOF
if [ ! -d \$HOME/.ssh ]; then
        \`mkdir \$HOME/.ssh\`
        \`touch \$HOME/.ssh/authorized_keys\`
        \`chmod 0600 \$HOME/.ssh/authorized_keys\`
else
    echo $var
EOF
于 2013-07-04T20:31:08.227 回答