स्क्रिप्ट ssh और कमांड चलाने के लिए काम नहीं करता है


10

नीचे स्क्रिप्ट है।

मैं कई सर्वरों को लॉगिन करना चाहता था और कर्नेल संस्करण की जांच करना चाहता था।

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

मुझे उम्मीद है कि आउटपुट जो पसंद आएगा ..

server1_hostname
kernel_version
server2_hostname
kernel_version

और इसी तरह..

मैंने इस स्क्रिप्ट को Server.txt में लगभग 80 सर्वरों के साथ चलाया

और मुझे जो आउटपुट मिला वो था .....

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.

यहाँ मुझे केवल 1 होस्ट के लिए आउटपुट मिला, जो है xxxxdev01और वह भी ssh बैनर और अन्य चेतावनी के साथ आता है।

मुझे अन्य सभी मेजबानों और बिना ssh बैनर के आउटपुट की आवश्यकता है .. यहाँ क्या गलत हो रहा है?


यदि आप किसी एक सर्वर को मैन्युअल रूप से उपयोग करते हैं और चलाते हैं तो क्या होता है sshpass -p password root@server histname?
terdon

1
उपयोग करें ssh -t -t root@... एक छद्म टर्मिनल को मजबूर करने के लिए।
garethTheRed

जवाबों:


11

मैं आपको यह नहीं बता सकता कि आपको अपेक्षित आउटपुट क्यों नहीं मिल रहे हैं hostnameऔर unameकमांड्स से, लेकिन मैं बाहरी पाठ के साथ मदद कर सकता हूं।

"छद्म-टर्मिनल" लाइनों द्वारा मुद्रित किया जा रहा है sshक्योंकि यह डिफ़ॉल्ट रूप से TTY आवंटित करने का प्रयास करता है जब कमांड लाइन पर कोई कमांड निष्पादित नहीं की जाती है। आप ssh कमांड में "-T" जोड़कर उस संदेश से बच सकते हैं:

sshpass -p password ssh -T root@$line

रिमोट सिस्टम पर शेल से "वार्निंग: नो एक्सेस टू ट्टी" लाइन आ रही है। cshऔर tcshउस संदेश को कुछ परिस्थितियों में प्रिंट करेगा। यह संभव है कि यह .cshrcरिमोट सिस्टम पर कुछ या समान फ़ाइल में ट्रिगर किया गया हो , कुछ सुविधा तक पहुंचने की कोशिश कर रहा है जिसमें TTY की आवश्यकता होती है।


4

निम्नलिखित कोड का उपयोग करें,

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

यह वही है जो मैंने पहले कोशिश की थी। लेकिन यह मुझे अपेक्षित आउटपुट नहीं देता है।
गोकुल

1

यदि आपके मेजबानों को अनुसरण के रूप में संग्रहीत किया जाता है server.txt

host1.tld
host2.tld
....

आप ऐसा कर सकते हैं

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

1

स्टड आपके दूरस्थ कमांड तक पहुंच योग्य नहीं है। आप क्या कर सकते हैं स्टड से कमांड पढ़ने के लिए बैश के "-s" ध्वज का उपयोग करें:

बैश मैनुअल से:

-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.

तो यह वही करना चाहिए जो आप चाहते हैं:

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

इसे भी देखें: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine


1

यह मेरे लिए बहुत अच्छा काम करता है:

 # 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

ध्यान दें कि त्रुटि से बचने -t -tके -Tलिए उपयोग करें

स्यूडो-टर्मिनल आवंटित नहीं किया जाएगा क्योंकि स्टडिन एक टर्मिनल नहीं है


1
आपको फॉर्मेटिंग पर पढ़ना चाहिए। आपका उत्तर उत्कृष्ट हो सकता है, लेकिन अभी यह बहुत ज्यादा अपठनीय है।
रोजा

0

मुझे लगता है कि एसएचएस खाने के दौरान बाकी को स्टड करने के लिए खाएं। आप विवरण के लिए बाश FAQ 89 का उल्लेख कर सकते हैं । FileDescriptor के साथ, निम्नलिखित कोड आपकी अपेक्षा के अनुसार काम करना चाहिए।

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

वैकल्पिक तरीका ssh के लिए / dev / null का उपयोग करना है। FileDescriptor को नजरअंदाज किया जा सकता है। `पढ़ते समय लाइन; do sshpass -p पासवर्ड ssh रूट @ $ लाइन </ dev / null << EOF .... किया <server.txt`
लियोन वांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.