এসএসএইচ কমান্ডে পাসওয়ার্ড সরবরাহ করতে ব্যাশ স্ক্রিপ্টে প্রত্যাশা ব্যবহার করুন


131

যারা আমার কাছে এসএসএইচ কী ব্যবহার করা উচিত তাদের জবাব দিতে চাই দয়া করে এড়িয়ে চলুন

আমি এসএসএইচ পাসওয়ার্ড সরবরাহ করার জন্য ব্যাশ স্ক্রিপ্টে প্রত্যাশা ব্যবহার করার চেষ্টা করছি। পাসওয়ার্ড প্রদান কাজ করে তবে আমার এসএসএইচ অধিবেশনটি শেষ হওয়ার মতো নয়, এটি স্ট্রেটকে পিছনে ফেলেছে।

আমার লিপি:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n" 
EOD
echo "you're out"

আমার স্ক্রিপ্টের আউটপুট:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out

আমি আমার এসএসএইচ অধিবেশনটি চাই এবং কেবল যখন আমি এটি থেকে বেরিয়ে আসি তখনই আমার ব্যাশ স্ক্রিপ্টে ফিরে যেতে চাই। প্রত্যাশার আগে আমি কেন ব্যাশ ব্যবহার করছি তার কারণ হ'ল আমি একটি মেনু ব্যবহার করেছি আমি কোন ইউনিটে কানেক্ট করতে হবে তা বেছে নিতে পারি।

ধন্যবাদ


49
দয়া করে প্রথম লাইনটি দেখুন: যারা এসএসএইচ কী ব্যবহার করা উচিত তাদের উত্তর দিতে চান তাদের কাছে দয়া করে বিরত থাকুন
সর্বোচ্চ

54
আমি আপনার প্রথম লাইনটি একটু বন্ধুত্বপূর্ণ হওয়ার জন্য সম্পাদনা করব। আপনি "সীমাবদ্ধতার কারণে, আমি কেবল এসএসএইচ কীগুলি ব্যবহার করতে পারি না, এটির প্রত্যাশা নিয়ে কাজ করার একটি উপায় খুঁজে বের করতে হবে" এর মতো কিছু বিবেচনা করতে পারেন। আপনারা আশা করা উচিত যে আপনি কীগুলি কী ব্যবহার করছেন না এবং লোকেরা স্বাভাবিকভাবেই আগ্রহী হতে পারে এবং কেবল সহায়ক হওয়ার চেষ্টা করছেন :) @ ইগনাসিও আপনাকে সেগুলি ব্যবহার করার পরামর্শ দেয় নি , তিনি কেবল এটিকে কোনও বাধা হিসাবে প্রমাণ করেছেন , তদারক নয় ।
টিম পোস্ট

আমি এই ক্ষেত্রে কর্মিট ব্যবহার করার চেষ্টা করব। এটা একটা হয়েছে খুব শক্তসমর্থ স্ক্রিপ্টিং ভাষা columbia.edu/kermit/skermit.html#scripts
f3xy

উত্তর:


86

বাশ এবং প্রত্যাশা মেশানো পছন্দসই প্রভাব অর্জনের জন্য ভাল উপায় নয়। আমি কেবল প্রত্যাশা ব্যবহার করার চেষ্টা করব:

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

ব্যাশের নমুনা সমাধান হতে পারে:

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

এটি প্রবেশের অপেক্ষা করবে এবং প্রত্যাবর্তনের চেয়ে (এক মুহুর্তের জন্য) ইন্টারেক্টিভ সেশনের জন্য অপেক্ষা করবে।


1
এটা দুর্দান্ত কাজ করে, ধন্যবাদ। আমি যদি এসএসএইচ এর মাধ্যমে লগ ইন করে একবার কমান্ড টাইপ করতে চাই, তবে আমার কী করা দরকার?
সর্বাধিক

এই স্ক্রিপ্টটি লগ ইন করা ব্যবহারকারীদের সাথে নিষ্ক্রিয় শেলটি ফিরিয়ে আনতে হবে। আমি প্রশ্ন বুঝতে পারি না। আপনি যদি একেবারে একই স্ক্রিপ্টটি ব্যাশটিতে ব্যবহার করতে চান তবে সম্পাদিত এন্ট্রিটি দেখুন।
পাইওটর ক্রল

যখন অনুরোধ করা হবে তখন আমি পাসওয়ার্ডটি প্রেরণ করি, একবার লগ ইন করে সিস্টেম কমান্ডগুলি প্রেরণ করতে চাই
সর্বোচ্চ

উপরের পোস্টে সাম্পল কোড যুক্ত করা হয়েছিল। অবশ্যই এটি কাজ করবে যতক্ষণ না মাই_কম্যান্ডএক্স রিটার্ন প্রম্পট পরিবর্তন না করে, যদি এটি ঘটে তবে প্রম্পট ভেরিয়েবল পরিবর্তন করা উচিত।
পাইটর ক্রল

@Pietrushnic আপনি কি কিছুটা ব্যাখ্যা করতে পারেন কেন "প্রত্যাশিত pt প্রম্পট" এর পরিবর্তে "ইন্টারেক্টিভ-ও-নোফার-$ প্রম্পট রিটার্ন" ব্যবহার করবেন? দ্বিতীয়টি দেখতে বেশি ব্যবহৃত হয় ..
রিচার্ড

53

সাসপ্যাস ব্যবহার করা সবচেয়ে সহজ উপায় । এটি উবুন্টু / ডেবিয়ান রেপোসে পাওয়া যায় এবং আপনাকে বাশের সাথে প্রত্যাশাকে একীকরণের সাথে ডিল করতে হবে না।

একটি উদাহরণ:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

উপরের কমান্ডটি সহজেই ব্যাশ স্ক্রিপ্টের সাথে সংহত করা যায়।

দ্রষ্টব্য: দয়া করে সুরক্ষা সম্পর্কিত বিষয়গুলিরman sshpass সম্পূর্ণ বোঝার জন্য সুরক্ষা বিবেচনা বিভাগটি পড়ুন ।


আমি জানি না এটি একটি ভাল সমাধান কিনা, তবে এটি অবশ্যই অনেক সহজ করে তোলে। ধন্যবাদ
এরিকবার্ক

9
সুরক্ষা দৃষ্টিকোণ থেকে অত্যন্ত বিপজ্জনক - কমান্ড-লাইন আর্গুমেন্টগুলি সিস্টেমের অন্য কোনও প্রক্রিয়া দ্বারা পড়া যেতে পারে। এগুলি ওভাররাইট করা সম্ভব এবং আশাকরি এটি sshpassহয় তবে তারপরেও একটি সময় আছে যখন পাসওয়ার্ডটি / প্রতিটি প্রক্রিয়া দেখার জন্য পাসওয়ার্ড উপলব্ধ থাকে তা করতে সক্ষম হওয়ার আগেই এটি শুরু হয়।
চার্লস ডাফি

1
পছন্দ করুন sshpassএমন একটি দৃশ্যে ব্যবহৃত হয় যেখানে আপনার স্থানীয় টেস্ট স্ক্রিপ্টগুলি স্থানীয় নেটওয়ার্ক পরিবেশে কার্যকর হয় যেখানে সুরক্ষা শীর্ষস্থানীয় উদ্বেগ নয়। প্রকৃতপক্ষে, এখানে একটি বিভাগ রয়েছে man sshpassযেখানে সুরক্ষা বিবেচনার উপর একটি সম্পূর্ণ বিভাগ ব্যাখ্যা করা হয়েছে। উত্তর দেওয়ার জন্য এটি যুক্ত করা হয়েছে, ধন্যবাদ।
ডটনিক্স

@ এরিকবি 85 সাধারণত, একটি প্যাকেজ আপনার জন্য সমস্ত নোংরা জিনিস তোলে, তবে, সমস্ত ক্ষেত্রে, এই স্ক্রিপ্টগুলি কেবল সেই ব্যবহারের জন্য তৈরি করা হয়, তবে আপনার নিজের স্টাফ যুক্ত করার চেয়ে ভাল। এই মন্তব্যটি চাকা পুনরায় উদ্ভাবন করবেন না। হার্ড স্টাফগুলি কেবল তখনই ডিল করুন যদি কোনও ব্যক্তি এখনও এটির সাথে কাজ করে না। sshpass এটি একটি ভাল ফাংশন।
এম

2
সম্পূর্ণতার জন্য, আমি উল্লেখ করেছি যে "ম্যান এসস্পাস" সম্ভাব্য ব্যবহারকারীকে যথাযথ সুরক্ষা সতর্কতা সরবরাহ করে, উল্লেখ করে যে "-p" এটি ব্যবহারের সর্বনিম্ন সুরক্ষিত উপায় এবং পরিবেশগত পরিবর্তনশীল মাধ্যমে পাসওয়ার্ড নেওয়ার জন্য "-e" বিকল্প প্রস্তাব করে এটি অন্তত কমান্ড লাইন থেকে দূরে রাখে।
রন বার্ক

22

আপনার EOD এর ঠিক আগে 'কথোপকথন' প্রত্যাশা কমান্ডটি যুক্ত করুন:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send "$PWD\n" 
interact
EOD
echo "you're out"

এটি আপনাকে লগআউট না করা পর্যন্ত দূরবর্তী মেশিনের সাথে যোগাযোগ করতে দেবে। তারপরে আপনি ব্যাশে ফিরে আসবেন।


এটি ভিতরে যায় এবং সঙ্গে সঙ্গে ফিরে চলে যায়। "আপনি বাইরে" মুদ্রিত হয়েছে।
এমমানুয়েল

8
আমি "ইন্টারেক্টিভ" এবং "ইওডি" কে "প্রত্যাশী ইওফ" দিয়ে প্রতিস্থাপন করেছি এবং এটি আমার পক্ষে কাজ করেছে। এটি একটি ম্যাকের উপর রয়েছে।
এমমানুয়েল

2
এই পৃষ্ঠার উত্তরগুলির কোনওোটাই আমার পক্ষে কাজ করেনি তবে @ ইমমানুয়েল এর পরামর্শটি সমস্যার expect eofসমাধান করার পরামর্শ দিয়েছিল ।
moertel

'থেকে সরান usr@$myhost.example.com'এবং এটি কাজ করা উচিত। আর সম্ভবত আপনি প্রতিস্থাপন করা প্রয়োজন \nসঙ্গে \rYMMV কিন্তু
টিনো

20

কয়েক মাস ধরে প্রশ্নের উত্তর খোঁজার পরে, আমি শেষ পর্যন্ত একটি সত্যিই সেরা সমাধান খুঁজে পেয়েছি: একটি সহজ স্ক্রিপ্ট লেখা।

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "Password:"
send "$password\r";
interact

এটিকে রাখুন /usr/bin/exp, তারপরে আপনি ব্যবহার করতে পারেন:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

সম্পন্ন!


expect "assword:"আপনি কি বোঝাতে চেয়েছিলেন expect "password:"?
ব্যবহারকারী

1
@user "assword"উভয় ম্যাচ হবে Passwordএবং password
ফার্ডিনানড.ক্রাফট

8

ব্যবহার নিশ্চিত করুন

send -- "$PWD\r" 

পরিবর্তে, ড্যাশ (-) দিয়ে শুরু হওয়া পাসওয়ার্ড অন্যথায় ব্যর্থ হবে।

উপরের অভ্যাসটি সেন্ড কমান্ডের বিকল্প হিসাবে ড্যাশ দিয়ে শুরু হওয়া একটি স্ট্রিংকে ব্যাখ্যা করবে।


8

একটি সহজ প্রত্যাশা স্ক্রিপ্ট

Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh $user@$ip
    expect "password"
    send "$password\r"
    interact

উদাহরণ:

    ./Remotelogin.exp <ip> <user name> <password>

7

সহায়ক সরঞ্জামটি ব্যবহার করুন fd0ssh(hxtools থেকে, পিএমটি নয়), এটি ssh প্রোগ্রাম থেকে কোনও নির্দিষ্ট প্রম্পট আশা না করেই কাজ করে।


এটা অসাধারণ! এটি চালানো কিছুটা শক্ত (অন্তত উবুন্টু সার্ভারে) তবে সহজেই কাজ করে! আমরা যে echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port user@yourserver.com & কনফিগারটি তৈরি করেছি: ধন্যবাদ!
জেপি ইলানেস

1
কমান্ড লাইনে পাসওয়ার্ড দেওয়ার চেয়ে অনেক বেশি নিরাপদ sshpass
চার্লস ডাফি

5

ব্যাশ স্ক্রিপ্ট থেকে একটি ছোট প্রত্যাশিত স্ক্রিপ্টটি ব্যবহার করার জন্য আমি যে উপকারীটি দরকারী বলে মনে করেছি তা নিম্নরূপ।

...
bash-script start
bash-commands
...
expect - <<EOF 
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...

এটি কাজ করে কারণ ...If the string "-" is supplied as a filename, standard input is read instead...


আপনার -এখানে প্রয়োজন নেই, যেমনটি আপনি যদি তর্ক ছাড়াই প্রার্থনা করেন তবে ডিফল্ট expectথেকে পড়ে stdin। তবে আপনি যদি কমান্ড প্রম্পট ( expectবনাম expect -) ছাড়াই ইন্টারেক্টিভভাবে এটি চালাতে চান তবে আপনি যদি এমন কোনও কিছু করতে চান expect -f "$@"যেখানে প্রথম আর্গুমেন্টটি কোনও ফাইলের মতো হবে, যদিও এটি বিকল্প হিসাবে প্রদর্শিত হবে (শুরু হয় -)। সেক্ষেত্রে, $1(প্রদত্ত ফাইলটি) যদি -এটি থেকে পড়ে থাকে stdin
টিনো

1

sshpassযদি আপনি এটি মেকফিলের অভ্যন্তরে সাব্লাইম টেক্সট বিল্ড টার্গেটের মধ্যে ব্যবহার করার চেষ্টা করেন তবে এটি ভাঙ্গা। পরিবর্তে sshpassআপনি ব্যবহার করতে পারেন passh: https://github.com/clarkwang/passh

সঙ্গে sshpassআপনাকে যা করতে হবে:

sshpass -p pa$$word ssh user@host

সঙ্গে passhআপনাকে যা করতে হবে:

passh -p pa$$word ssh user@host

দ্রষ্টব্য: ব্যবহার করতে ভুলবেন না -o StrictHostKeyChecking=no, অন্যথায় সংযোগটি প্রথমবার ব্যবহার করার পরে স্তব্ধ হয়ে যাবে। উদাহরণ স্বরূপ:

passh -p pa$$word ssh -o StrictHostKeyChecking=no user@host

তথ্যসূত্র:

  1. পাসওয়ার্ডের জন্য প্রেরণ কমান্ড ssh সংযোগে প্রত্যাশা স্ক্রিপ্ট ব্যবহার করে না
  2. /ubuntu/87449/how-to-disable-strict-host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
  4. /server/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.