由于stdin不是终端ssh bash,因此不会分配伪终端

时间:2013-07-15 19:28:19

标签: bash terminal

当我从server.txt列表ssh到我的服务器时,

好吧,这是我代码的一部分。

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
    echo Connected to "$serverName"
    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实际上并没有连接并执行服务器上的代码,它假设是ssh'd。

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

2 个答案:

答案 0 :(得分:3)

您似乎假设当您运行ssh连接到服务器时,文件中的其余命令将传递到ssh中运行的远程shell。他们不是;相反,ssh终止后,它们将由本地shell处理,并将控制返回给它。

要通过ssh运行远程命令,您可以执行以下操作:

  • 将要执行的命令写入文件。使用scp将文件复制到远程服务器,然后使用ssh user@remote command
  • 执行该文件
  • 了解一点TCL并使用expect
  • 将命令写入heredoc,但要注意变量替换:替换发生在客户端,而不是服务器上。例如,这将输出您的本地主目录,而不是远程:

    ssh remote <<EOF
    echo $HOME
    EOF
    

    要使其打印远程主目录,您必须使用echo \$HOME

另外,请记住,如果要在远程端读取数据文件,则必须明确复制filelist.txt等数据文件。

答案 1 :(得分:3)

我觉得上面刚才所说的一切都是错误的。

期望?

很简单:

ssh -i ~/.ssh/bobskey bob@10.10.10.10 << EOF
echo I am creating a file called Apples in the /tmp folder
touch /tmp/apples
exit
EOF

2“EOF”之间的所有内容都将在远程服务器中运行。

标签必须相同。如果您决定将“EOF”替换为“WayneGretzky”,则还必须更改第二个EOF。