bash中的SSH while循环。伪终端将不会分配,因为stdin不是终端

时间:2019-03-22 12:38:46

标签: bash while-loop pty stty

我正在尝试将文件ssh循环到服务器列表,并在这些服务器上对某些日志文件执行find命令。我知道ssh将吞没整个输入文件。所以我正在使用-n参数来ssh。效果很好,但是在某些服务器上我遇到了新错误。

输入文件的构建方式如下: 服务器名称:位置:mtime:logfileexention

我使用的Bash代码是:

sshCmd="ssh -n -o ConnectTimeout=5 -o Batchmode=yes -o StrictHostKeyChecking=no -o CheckHostIP=no -o PasswordAuthentication=no -q"

while IFS=: read -r f1 f2 f3 f4 ; do        
$sshCmd "$f1"
find "$f2" -type f -name "$f4" -mtime +"$f3"

在某些服务器上,我收到以下错误:

由于stdin不是终端,因此不会分配伪终端。 stty:标准输入:设备的ioctl不正确

我尝试了多种选择来解决此问题。我曾经使用-t,-tt,-T选项,但是使用这些选项时,相同的错误仍然存​​在,或者终端变得无响应。

有人对此有解决方案吗?

2 个答案:

答案 0 :(得分:1)

您不在远程主机上运行find;您正在尝试在远程主机上运行登录shell,只有在退出后find才会运行。此外,由于使用/dev/null选项,远程外壳程序的标准输入已从-n重定向,因此失败。

sshCmd="ssh -n -o ConnectTimeout=5 -o Batchmode=yes -o StrictHostKeyChecking=no -o CheckHostIP=no -o PasswordAuthentication=no -q"

while IFS=: read -r f1 f2 f3 f4 ; do   
  # Beware of values for f2, f3, and f4 containing double quotes themselves.     
  $sshCmd "$f1" "find \"$f2\" -type f -name \"$f4\" -mtime +\"$f3\""
done

无关,但sshCmd应该是函数,而不是要扩展的变量。

sshCmd () {
  ssh -n -o ConnectTimeout=5 -o Batchmode=yes -o StrictHostKeyChecking=no -o CheckHostIP=no -q "$@"
}

while IFS=: read -r f1 f2 f3 f4; do
   sshCmd "$f1" "find \"$f2\" -type f -name \"$f4\" -mtime +\"$f3\""
done

答案 1 :(得分:0)

次要添加:为自己节省一些反斜杠悲伤:

while IFS=: read -r f1 f2 f3 f4; do
   sshCmd "$f1" "find '$f2' -type f -name '$f4' -mtime +'$f3'"
done

双引号中的所有内容都将在命令处理之前进行扩展,因此值将被扩展并位于单引号中,以供远程主机处理;即远程主机将看到值,而不是变量名。

(关于f1,f2,f3,f4包含单引号的可能性的标准免责声明适用...)