2

我正在尝试在 bash 脚本中通过 SSH 进行连接。

这是我的脚本:

file_table="${HOME}/.scripts/list.txt"

    while read line; do  
  user=$(echo $line | cut -d\= -f1)

  if [ "$1" = "$user" ]; then
        ip=$(echo $line | cut -d\= -f2)
        ssh -t -t -X "$ip"  
  fi
done < $file_table

exit 1

我在 list.txt 中保存了一些别名,例如:“name1=192.168.1.1”、“name2=127.0.0.1”等等。

问题: SSH 连接没有等待。它只是要求输入密码,如果建立连接,它会在脚本处继续(退出 1)。我尝试了命令“等待”或使用后台作业和“fg %1”,但没有任何效果。

注意:我不想在建立连接后执行命令。在我退出之前,我不会保持连接。

4

2 回答 2

2

SSH 可能出现的问题

也许您有一个别名或函数将 SSH 发送到后台,或者您的 SSH 配置文件中发生了其他事情。我用一个显式关闭别名的简化循环进行了测试,它在 shell 提示符下对我来说很好:

# Loop without the other stuff.
while true; do
    command ssh -o ControlPersist=no -o ControlPath=none localhost
done

您总是可以尝试set -x查看 Bash 对您的命令行做了什么,并ssh -v获得更详细的输出。

Shell 重定向可能出现的问题

在考虑了一个替代答案后,我同意另一个相关问题是标准输入的重定向。这对我有用,即使标准输入重定向到循环中:

# Generic example of bullet-proofing the redirection of stdin.
TTY=$(tty)
while true; do
    ssh  -o ControlPersist=no -o ControlPath=none localhost < $TTY
done < /dev/null

考虑到这一点,您的原始循环可以被清理并重写为:

TTY=$(tty)    
while IFS== read -r user ip; do
    [[ "$user" == "$1" ]] && ssh -ttX "$user@$ip" < $TTY
done < "${HOME}/.scripts/list.txt"
于 2012-06-09T15:19:42.123 回答
2

当 ssh 在whilestdin 重定向的循环中运行时,它可能会挂起。尝试以下方法之一:

ssh -t -t -n -X "$ip"

或者

ssh -t -t -X "$ip" </dev/null

或者

ssh -t -t -f -X "$ip"

顺便说一句,cut您可以read直接进入变量,而不是使用:

while IFS== read -r user ip

你为什么要这样做exit 1?非零表示失败。

于 2012-06-09T16:14:06.283 回答