我正在尝试通过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之间的命令在本地计算机上开始执行而不等待提供传递。在继续编写脚本之前有没有办法等待传递?
答案 0 :(得分: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