বাশ স্ক্রিপ্টে প্রত্যাশা ও প্রেরণের মাধ্যমে sudo কমান্ডগুলি কীভাবে কার্যকর করা যায়?


10

sudoকমান্ডগুলি কীভাবে কার্যকর করতে হয় তা আমাকে কেউ জানতে দিতে পারে expect? আমি নিম্নলিখিত চেষ্টা করেছিলাম কিন্তু এটি কাজ করছে না। আমাকে কেউ পরামর্শ দিতে পারেন দয়া করে?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "output=$(sudo virsh list --all | awk "/running/{print \$2}" | tail -2); sudo virsh dominfo $output"
expect "password:"
send "$pw\r"
expect "#"

যখন আমি নীচের স্ক্রিপ্টটি চেষ্টা করেছি, এটি ত্রুটি ছাড়াই কার্যকর করা হয়েছিল, তবে আমি আউটপুটটি পাই নি। এখানে স্ক্রিপ্ট এবং আউটপুট এটি কার্যকর করা হয়। এখানে আমি কোথায় ভুল করছি?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}

ফাঁসি

sasuke@njob:~$ ./hypr.sh 
spawn ssh sasuke@hostname 
sasuke@hostname's password: 
sasuke@hostname:~$ output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -10)sudo virsh dominfo '$output' sasuke@njob:~$

উত্তর:


10
set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}

টিসিএল (এবং, এক্সটেনশান দ্বারা, প্রত্যাশা) এ, কোঁকড়ানো ধনুর্বন্ধনী ধাঁধাটি শেলের একক উদ্ধৃতিগুলির মতো কাজ করে: ভেরিয়েবল সম্প্রসারণকে বাধা দেয়।

প্রত্যাশার মাল্টি-প্যাটার্ন ফর্মটি সেই ক্ষেত্রে কার্যকর যেখানে আপনি কোনও প্যাটার্ন দেখতে পাবেন না। exp_continueবিবৃতি মূলত "লুপ" এর মধ্যে যাতে আপনি পাসওয়ার্ড পাঠাতে পারেন আশা এবং প্রম্পট আশা অবিরত। যেহেতু প্রম্পট প্যাটার্নের সাথে কোনও ক্রিয়াকলাপ নেই, তাই নিয়ন্ত্রণ প্রত্যাশার আদেশ থেকে পরেরটিতে চলে যায়।

আমি আপনাকে আলাদা স্ক্রিপ্ট হিসাবে এটি সংরক্ষণ করার পরামর্শ দিচ্ছি। প্রথম লাইন হওয়া উচিত

#!/usr/bin/expect -f

আপনি যদি একটি শেল স্ক্রিপ্ট এম্বেড করতে চান:

#!/bin/sh
expect <<'END'
   # code as above
END

প্রথম "END" এর আশেপাশের উদ্ধৃতিগুলি নোট করুন - এতে পুরো-এখানে নথির একক উদ্ধৃতি দেওয়ার প্রভাব রয়েছে যাতে আপনাকে প্রত্যাশা ভেরিয়েবলের ব্যাখ্যা করার শেলটি নিয়ে চিন্তা করতে হবে না


হাই গ্লেন, স্ক্রিপ্টটি কোনও ত্রুটি ছাড়াই কার্যকর করা হচ্ছে, তবে আমি স্কার্পের আউটপুট দেখতে অক্ষম। আমি কি স্ক্রিপ্টে কোনও ভুল করছি? যদি হ্যাঁ দয়া করে আমাকে জানান আমি পৃথক ফাইলে আউটপুট সংরক্ষণ করি। এখানে আমি স্ক্রিপ্টটি সম্পাদন করছি যা আমি সাসুকে @ এনজব সম্পাদনা করছি: ~ $ ./hypr.sh স্পন এসএসএসুক @ হোস্টনাম সাসুক @ হোস্টনামের পাসওয়ার্ড: সাসুক @ হোস্টনাম: ~ $ আউটপুট = $ (সুডো বর্ষ তালিকা - সমস্ত | আড়ক '/ চলমান / {$ 2 মুদ্রণ} | কষ্ট @ njob 'লেজ -10) উবুন্টু virsh dominfo' $ আউটপুট ': ~ $
কষ্ট

আপনি মন্তব্যগুলিতে কোড পোস্ট করতে পারবেন না, দয়া করে আপনার প্রশ্নে এটি যুক্ত করুন
গ্লেন জ্যাকম্যান

ওহ এর জন্য আমি দুঃখিত ধন্যবাদ আমি এটা করেছি। আমাকে সাহায্য করুন.
সাসুক

জানিনা। exp_internal 1স্ক্রিপ্টের শীর্ষে যুক্ত করুন এবং ভার্বোজ আউটপুট পড়ুন।
গ্লেন জ্যাকম্যান

3

আমি আমার বিচি ভাগ করতে চাই। আমি আমার সিস্টেমে এটি চেষ্টা করেছি। এটা ঠিক কাজ করছে।

#!/usr/bin/expect
set username "myname"
set password "mypasswd"
set hosts "hostname"
foreach line [split $ip \n] {
spawn ssh -o StrictHostKeyChecking=no $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "sudo virsh list|awk '{print \$2}'|grep 'inmobi' >vm.list; for host in `cat vm.list`; do sudo virsh dominfo \$host >> vm.info; done\n"
expect "$"
send -- "$password\n"
expect "$"
send -- "exit\n"

1

এটি কাজ করা উচিত "ইন্টারঅ্যাক্ট" কমান্ড দিয়ে এটিকে শেষ করার চেষ্টা করুন।

spawn ssh -l $username $ip -p $sshport
sleep 5
expect "password:"
send "$pass\r"
interact

0

আমি মনে করি আপনার উদ্ধৃতিগুলির মধ্যে উদ্ধৃতিগুলি ব্যাকস্ল্যাশ করতে হবে। অন্যথায় expect"কমান্ড" পরে কমান্ডটি শেষ হবে বলে মনে করে:

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.