Script untuk ssh dan menjalankan perintah tidak berfungsi


10

Di bawah ini adalah skripnya.

Saya ingin masuk ke beberapa server dan memeriksa versi kernel.

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done

Saya akan mengharapkan output yang berjalan seperti ..

server1_hostname
kernel_version
server2_hostname
kernel_version

dan seterusnya..

Saya menjalankan skrip ini dengan sekitar 80 server di server.txt

Dan output yang saya dapatkan seperti .....

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

========================================================================
================================ WARNING ===============================
========================================================================
This system is solely for the use of authorized personnel. Individuals
using this system are subject to having some or all of their activities
monitored and recorded. Anyone using this system expressly consents to
such monitoring and is advised that any unauthorized or improper use of
this system may result in disciplinary action up to and including
termination of employment. Violators may also be subject to civil and/or
criminal penalties.
========================================================================

Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
xxxxdev01
2.6.32-431.23.3.el6.x86_64
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.

Di sini saya mendapatkan output hanya untuk 1 host, yang xxxxdev01dan itu juga datang dengan spanduk ssh dan peringatan lainnya.

Saya perlu output dari semua host lain dan tanpa spanduk ssh .. Apa yang salah di sini?


Apa yang terjadi jika Anda menggunakan salah satu server secara manual dan berjalan sshpass -p password root@server histname?
terdon

1
Gunakan ssh -t -t root@... untuk memaksa terminal semu.
garethTheRed

Jawaban:


11

Saya tidak bisa memberi tahu Anda mengapa Anda tidak mendapatkan hasil yang diharapkan dari perintah hostnamedan uname, tetapi saya dapat membantu dengan teks yang tidak berhubungan.

Baris "Pseudo-terminal" sedang dicetak oleh sshkarena mencoba mengalokasikan TTY secara default ketika tidak ada perintah untuk dieksekusi disediakan pada baris perintah. Anda dapat menghindari pesan itu dengan menambahkan "-T" ke perintah ssh:

sshpass -p password ssh -T root@$line

Baris "Peringatan: tidak ada akses ke tty" berasal dari shell pada sistem jarak jauh. cshdan tcshakan mencetak pesan itu dalam keadaan tertentu. Mungkin saja dipicu oleh sesuatu di file .cshrcatau serupa pada sistem jarak jauh, mencoba mengakses beberapa fitur yang memerlukan TTY.


4

Gunakan kode berikut,

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
  sshpass -p password ssh root@$line 'hostname;uname -r'
done

Ini yang saya coba dulu. Tapi itu tidak memberi saya hasil yang diharapkan.
Being Gokul

1

Jika host Anda disimpan sebagai ikuti server.txt

host1.tld
host2.tld
....

Kamu bisa

mapfile -t myhosts < server.txt; for host in "${myhosts[@]}"; do ssh username@"$host" 'hostname;uname -r'; done

1

Stdin tidak dapat diakses oleh perintah jarak jauh Anda. Yang bisa Anda lakukan adalah menggunakan "-s" flag of bash untuk membaca perintah dari stdin:

Dari manual bash:

-s        If the -s option is present, or if no arguments remain after
          option processing, then commands are read from the standard 
          input.  This option allows the positional parameters to be set
          when  invoking  an  interactive shell.

Jadi ini harus melakukan apa yang Anda inginkan:

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
    sshpass -p password ssh root@$line bash -s << EOF
hostname
uname -r
EOF
done

Lihat juga: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine


1

Ini sangat bagus untuk saya:

 # cat hostsname.txt 
operation01  172.20.68.37 5fDviDEwew
ngx-gw01     172.20.68.36 FiPp2UpRyu
gateway01    172.20.68.35 KeMbe57zzb
vehicle01    172.20.68.34 FElJ3ArM0m

# cat hostsname.txt | while read hostname ipaddr passwd; do sshpass -p $passwd /usr/bin/ssh-copy-id $ipaddr;done

perhatikan bahwa gunakan -t -tbukannya -Tuntuk menghindari kesalahan

Pseudo-terminal tidak akan dialokasikan karena stdin bukan terminal


1
Anda harus membaca tentang pemformatan. Jawaban Anda mungkin sangat baik tetapi baru saja itu tidak terbaca.
roaima

0

Saya kira ssh sementara memakan sisanya untuk stdin. Anda dapat merujuk Bash FAQ 89 untuk detailnya. Dengan FileDescriptor, kode berikut harus berfungsi sesuai harapan Anda.

while read line <& 7
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done 7< server.txt

cara alternatifnya adalah menggunakan / dev / null untuk ssh. FileDescriptor dapat diabaikan. `sambil membaca baris; lakukan sshpass -p kata sandi ssh root @ $ line </ dev / null << EOF .... done <server.txt`
Leon Wang
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.