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を実行してサーバーに接続すると、ファイル内の残りのコマンドが で実行されているリモート シェルに渡されると想定しているようですssh。ではない; 代わりに、いったんssh終了して制御を戻すと、ローカル シェルによって処理されます。

リモート コマンドを実行するsshには、いくつかの方法があります。

  • 実行したいコマンドをファイルに書き込みます。を使用してファイルをリモートサーバーにコピーしscp、で実行しますssh user@remote command
  • TCL を少し学んで使用するexpect
  • コマンドはヒアドキュメントに記述しますが、変数の置換には注意してください。置換はサーバーではなくクライアントで行われます。たとえば、これはリモートではなく、ローカルのホーム ディレクトリを出力します。

    ssh remote <<EOF
    echo $HOME
    EOF
    

    リモートホームディレクトリを出力するには、echo \$HOME.

また、 などのデータ ファイルをfilelist.txtリモート側で読み取る場合は、明示的にコピーする必要があることに注意してください。

于 2013-07-15T19:36:44.430 に答える
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」に置き換える場合は、2 番目の EOF も変更する必要があります。

于 2013-10-28T18:46:10.847 に答える