脚本中的伪终端消息

脚本中的伪终端消息

这是我的脚本

#!/bin/bash
exec < filelist.txt
    while read updatedfile oldfile; do
    #   echo updatedfile = "$updatedfile" #use for troubleshooting
    #   echo oldfile = "$oldfile" #use for troubleshooting
               if [[ ! $updatedfile =~ [^[:space:]] ]] ; then  #empty  line exception
                continue # empty line exception
               fi
               if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi 
            echo Comparing $updatedfile with $oldfile
            if diff "$updatedfile" "$oldfile" >/dev/null ; then
                echo The files compared are the same. No changes were made.
            else
                echo The files compared are different.
                cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
                cp -f -v $updatedfile $oldfile 
            fi          
    done
#go through rest of servers from list
while read server <&3; do   #read server names into the while loop    
serverName=$(uname -n)
 if [[ ! $server =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
 echo server on list = "$server"
 echo server signed on = "$serverName"
 if [ $serverName == $server ] ; then #makes sure a server doesnt try to ssh to itself
    continue
 fi
    echo "Connecting to - $server"
    ssh "$server"  #SSH login
    exec < filelist.txt
    while read updatedfile oldfile; do
    #   echo updatedfile = $updatedfile #use for troubleshooting
    #   echo oldfile = $oldfile   #use for troubleshooting
               if [[ ! $updatedfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi
               if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi 
            echo Comparing $updatedfile with $oldfile
            if diff "$updatedfile" "$oldfile" >/dev/null ; then
                echo The files compared are the same. No changes were made.
            else
                echo The files compared are different.
                cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
                cp -f -v $updatedfile $oldfile 
            fi          
    done
done 3</infanass/dev/admin/servers.txt

当我尝试通过 ssh 连接到我的服务器列表时,出现错误。

Pseudo-terminal will not be allocated because stdin is not a terminal.

然后我的脚本无法正确 ssh 并比较新登录服务器中的文件。有人知道这是为什么吗?

答案1

您是否期望 get 之后的所有命令都ssh "$server"在 ssh 内运行?事情不是这样的。使用主机名且没有其他参数的 ssh 启动交互式会话。退出后,脚本继续执行下一个命令 ( exec < filelist.txt)。这不是 ssh 内的远程命令;当命令到达时,ssh 已完成并消失。这只是包含脚本的正常顺序执行。

带有重定向 stdin 的交互式 ssh 会话有些不寻常。这就是您收到警告的原因。 (要消除警告,您可以使用-t-T

如果你想通过 ssh 连接传递一个大脚本并远程运行它,你可以使用这里的文档, 像这样:

ssh "$server" sh <<EOF
your big script here...
EOF

请务必仔细考虑哪些变量应由本地脚本扩展,哪些变量应在远程脚本执行期间扩展。$Heredoc 中未受保护的内容将在本地扩展。要保护它,以便远程 shell 看到 a $,请使用\$.如果您希望所有这些都受到保护,您可以更改<<EOF<<'EOF'.

相关内容