在bash中使用SSH while循环。由于stdin不是终端,因此不会分配伪终端

问题描述 投票:0回答:2

我试图将文件循环到ssh到服务器列表,并在这些服务器上为某些日志文件执行find命令。我知道ssh会吞下整个输入文件。所以我使用-n参数来ssh。这工作正常,但一旦服务器我遇到一个新的错误。

输入文件的构建如下:servername:location: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选项,但在使用这些选项时,相同的错误仍然存​​在或终端无响应。

有人有解决方案吗?

bash while-loop pty stty
2个回答
1
投票

您没有在远程主机上运行find;您正尝试在远程主机上运行登录shell,并且只有在退出后才会运行find。此外,远程shell失败,因为由于/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

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的可能性......)

© www.soinside.com 2019 - 2024. All rights reserved.