0

好的,当我从 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 的代码。

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

2 回答 2

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。

于 2013-10-28T18:46:10.847 回答
3

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

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

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

    ssh remote <<EOF
    echo $HOME
    EOF
    

    要让它打印你必须使用的远程主目录echo \$HOME

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

于 2013-07-15T19:36:44.430 回答