কমান্ড চালাতে এবং চালাতে স্ক্রিপ্ট কার্যকর হয় না


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

ইত্যাদি

আমি এই স্ক্রিপ্টটি সার্ভার.টেক্সটে প্রায় ৮০ টি সার্ভার দিয়ে চালিয়েছি

এবং আউটপুট আমি পেয়েছিলাম মত .....

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এসএসএস ব্যানার এবং অন্যান্য সতর্কতা।

আমার অন্য সকল হোস্টের এবং এসএসএস ব্যানার ছাড়াই আউটপুট প্রয়োজন .. এখানে কী ভুল হচ্ছে?


আপনি যদি কোনও একটি সার্ভার ম্যানুয়ালি ব্যবহার করেন এবং চালিত হন তবে কী হবে sshpass -p password root@server histname?
টেরডন

1
ssh -t -t root@সিউডো-টার্মিনালটি জোর করার জন্য ... ব্যবহার করুন ।
গ্যারেথTheRed

উত্তর:


11

আপনি কেন hostnameএবং unameআদেশগুলি থেকে প্রত্যাশিত আউটপুট পাচ্ছেন না তা আমি আপনাকে বলতে পারি না , তবে আমি বহিরাগত পাঠ্যের সাথে সহায়তা করতে পারি।

"সিউডো-টার্মিনাল" লাইনগুলি মুদ্রণ করা হচ্ছে sshকারণ এটি কমান্ড লাইনে কোনও আদেশ কার্যকর করার জন্য যখন ডিফল্টরূপে একটি টিটিওয়াই বরাদ্দ করার চেষ্টা করে। Ssh কমান্ডে "-T" যুক্ত করে আপনি এই বার্তাটি এড়াতে পারবেন:

sshpass -p password ssh -T root@$line

দূরবর্তী সিস্টেমের শেল থেকে "সতর্কতা: টিটিআইয়ের অ্যাক্সেস নেই" লাইনটি আসছে। cshএবং tcshনির্দিষ্ট পরিস্থিতিতে সেই বার্তাটি মুদ্রণ করবে। এটি সম্ভব যে এটি .cshrcরিমোট সিস্টেমে বা অনুরূপ ফাইলের কোনও কিছু দ্বারা ট্রিগার করা হয়েছে, এমন কোনও বৈশিষ্ট্য অ্যাক্সেস করার চেষ্টা করছে যাতে একটি টিটিওয়াই প্রয়োজন।


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

আমার মনে হয় এসএসএসের মধ্যে বাকিটা স্টিডিনে খেয়ে ফেলছি। আপনি বিশদে জিজ্ঞাসা প্রশ্নাবলী 89 দেখতে পারেন । ফাইলডেস্ক্রিপ্টারের সাহায্যে নিম্নলিখিত কোডগুলি আপনার প্রত্যাশা হিসাবে কাজ করা উচিত।

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

বিকল্প উপায় হ'ল ssh এর জন্য / dev / নাল ব্যবহার করা। ফাইলডেস্ক্রিপ্টর উপেক্ষা করা যায়। read পড়ার সময় লাইন; sshpass -p পাসওয়ার্ড ssh root @ $ লাইন </ dev / নাল << ইওফ .... সম্পন্ন <সার্ভার.টেক্সট`
লিওন ওয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.