2013-07-04 120 views
1

我试图通过ssh在远程计算机上执行命令,并且我需要脚本等到ssh密码提供(如有必要)。 这是我的代码片段:在bash脚本中等待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开始在本地机器上,而无需等待通以提供执行。在继续使用脚本之前是否有任何方法等待通行证?

+2

请当你把代码粘贴代码,而不是它的一些幻想逼近。这些反引号不能出现在你的代码中。 – reinierpost

回答

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 
+0

现在我觉得很蠢:) 谢谢! – ddario

+1

有什么不容易的是,如果你不知道,找一个好的关键字在搜索引擎上自己找到它。 –

+0

你有没有机会知道如何将变量传递给EOF之间的部分?我之前设置的那些都是空的。 – ddario