Script để ssh và chạy một lệnh không hoạt động


10

Dưới đây là kịch bản.

Tôi muốn đăng nhập một số máy chủ và kiểm tra phiên bản 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

Tôi mong đợi đầu ra giống như ..

server1_hostname
kernel_version
server2_hostname
kernel_version

và như thế..

Tôi đã chạy tập lệnh này với khoảng 80 máy chủ trong server.txt

Và đầu ra tôi nhận được là .....

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.

Ở đây tôi nhận được đầu ra chỉ có 1 máy chủ, xxxxdev01và điều đó cũng đi kèm với biểu ngữ ssh và cảnh báo khác.

Tôi cần đầu ra của tất cả các máy chủ khác và không có biểu ngữ ssh .. Điều gì đang xảy ra ở đây?


Điều gì xảy ra nếu bạn sử dụng một trong các máy chủ theo cách thủ công và chạy sshpass -p password root@server histname?
terdon

1
Sử dụng ssh -t -t root@... để buộc một thiết bị đầu cuối giả.
garethTheRed

Câu trả lời:


11

Tôi không thể cho bạn biết lý do tại sao bạn không nhận được đầu ra mong đợi từ các lệnh hostnameuname, nhưng tôi có thể giúp với văn bản không liên quan.

Các dòng "Pseudo-terminal" đang được in bởi sshvì nó cố gắng phân bổ TTY theo mặc định khi không có lệnh nào được thực thi được cung cấp trên dòng lệnh. Bạn có thể tránh thông báo đó bằng cách thêm "-T" vào lệnh ssh:

sshpass -p password ssh -T root@$line

Dòng "Cảnh báo: không có quyền truy cập vào tty" đến từ trình bao trên hệ thống từ xa. cshtcshsẽ in thông điệp đó trong những trường hợp nhất định. Có thể nó được kích hoạt bởi một cái gì đó trong .cshrchoặc tệp tương tự trên hệ thống từ xa, cố gắng truy cập một số tính năng yêu cầu TTY.


4

Sử dụng mã sau đây,

#!/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

Đây là những gì tôi đã thử đầu tiên. Nhưng nó không mang lại cho tôi sản lượng dự kiến.
Là Gokul

1

Nếu máy chủ của bạn được lưu trữ như sau server.txt

host1.tld
host2.tld
....

Bạn có thể

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

1

Các stdin không thể truy cập vào các lệnh từ xa của bạn. Những gì bạn có thể làm là sử dụng cờ bash "-s" để đọc các lệnh từ stdin:

Từ hướng dẫn sử dụng 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.

Vì vậy, điều này sẽ làm những gì bạn muốn:

#!/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

Xem thêm: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine


1

Điều này làm việc rất tốt cho tôi:

 # 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

lưu ý rằng sử dụng -t -tthay vì -Tđể tránh lỗi

Thiết bị đầu cuối giả sẽ không được phân bổ vì stdin không phải là thiết bị đầu cuối


1
Bạn nên đọc lên định dạng. Câu trả lời của bạn có thể là tuyệt vời nhưng bây giờ nó không thể đọc được.
roaima

0

Tôi đoán các ssh trong khi ăn phần còn lại để stdin. bạn có thể tham khảo Bash FAQ 89 để biết chi tiết. Với FileDescriptor, các mã sau sẽ hoạt động như mong đợi của bạn.

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

cách khác là sử dụng / dev / null cho ssh. FileDescriptor có thể được bỏ qua. `trong khi đọc dòng; làm sshpass -p mật khẩu ssh root @ $ line </ dev / null << EOF .... xong <server.txt`
Leon Wang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.