বাশ স্ক্রিপ্ট থেকে একটি পাসওয়ার্ড দিয়ে sftp কমান্ডটি কীভাবে চালানো যায়?


173

আমার লিনাক্স হোস্ট থেকে sftp ব্যবহার করে দূরবর্তী হোস্টে লগ ফাইল স্থানান্তর করতে হবে । আমার অপারেশন গ্রুপ থেকে আমাকে এর জন্য শংসাপত্র সরবরাহ করা হয়েছে। তবে, যেহেতু অন্য হোস্টের উপর আমার নিয়ন্ত্রণ নেই, তাই আমি অন্য হোস্টের সাথে আরএসএ কী উত্পন্ন এবং ভাগ করতে পারি না।

তাহলে ক্রোন জবের sftpমাধ্যমে বাশ স্ক্রিপ্টের ভেতর থেকে কমান্ডটি (ব্যবহারকারীর নাম / পাসওয়ার্ড সহ) চালানোর কোনও উপায় আছে ?

আমি একটি অনুরূপ স্ট্যাক ওভারফ্লো প্রশ্ন পেয়েছি, একটি ব্যাশ স্ক্রিপ্টে sftp এর জন্য পাসওয়ার্ড নির্দিষ্ট করুন , তবে আমার সমস্যার কোনও সন্তোষজনক উত্তর পাওয়া যায় নি।

উত্তর:


178

আপনার কাছে সর্বজনীন কী প্রমাণীকরণ ব্যবহার করা ছাড়াও কয়েকটি বিকল্প রয়েছে:

  1. কীচেন ব্যবহার করুন
  2. এসএসপাস ব্যবহার করুন (কম সুরক্ষিত তবে সম্ভবত এটি আপনার প্রয়োজনীয়তা পূরণ করে)
  3. প্রত্যাশা ব্যবহার করুন (কমপক্ষে সুরক্ষিত এবং আরও কোডিং প্রয়োজন)

আপনি যদি এসএসপাসকে একটি সুযোগ দেওয়ার সিদ্ধান্ত নেন তবে তা করার জন্য এখানে একটি ওয়ার্কিং স্ক্রিপ্ট স্নিপেট রয়েছে:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

3
ম্যাক এ ব্যবহার করার জন্য: stackoverflow.com/questions/9102557/…
অনুভা

18
রফতানি করার দরকার নেই বলে আমি মনে করি। SSHPASS=password sshpass -e ...করা উচিত.
জেনস

9
লগ ফাইলটি ডাউনলোড করতে আমি ওয়ান-লাইনার করতে সক্ষম হয়েছি:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
মেঘ কারিগর

6
@ গারাস: ওয়ান-লাইনার খুব দুর্দান্ত তবে আমি কমান্ড লাইনে পাসওয়ার্ড ব্যবহার করতে চাইনি কারণ উন্নত স্নুপিং ঝুঁকির কারণে।
অনুভা

8
-oBatchMode=noআমার জন্য গুরুত্বপূর্ণ অনুপস্থিত অংশ ছিল।
রিচার্ডমিলার

99

আর একটি উপায় lftp ব্যবহার করা হবে:

lftp sftp://user:password@host  -e "put local-file.name; bye"

এই পদ্ধতির অসুবিধা হ'ল কম্পিউটারে থাকা অন্যান্য ব্যবহারকারীরা এই জাতীয় সরঞ্জামগুলি থেকে পাসওয়ার্ডটি পড়তে পারেন psএবং পাসওয়ার্ডটি আপনার শেল ইতিহাসের অংশ হতে পারে।

একটি আরও সুরক্ষিত বিকল্প যা এলএফটিপি ৪.৪.০ সেট করে সেটি উপলভ্য LFTP_PASSWORD পরিবেশের পরিবর্তনশীল এবং এর সাথে lftp--env-password । এখানে একটি সম্পূর্ণ উদাহরণ:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

এলএফটিপিতে একটি দুর্দান্ত মিররিং বৈশিষ্ট্যও রয়েছে (নিশ্চিত হওয়া স্থানান্তরের পরে মোছা অন্তর্ভুক্ত থাকতে পারে --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9
বিকল্প প্রস্তাব দেওয়ার জন্য +1 কিন্তু আমরা কি কমান্ড লাইনে পাসওয়ার্ড সরবরাহ করা এড়াতে পারি?
অনুভা

1
একই কম্পিউটারে যে কাউকে পাসওয়ার্ড দেখানোর জন্য
ডাউনভোটড

10
আপনি lftp এর জন্য স্ক্রিপ্ট ফাইলটি তৈরি করতে পারেন, এইভাবে আপনাকে কমান্ড লাইনে পাসওয়ার্ড দিতে হবে না। একটি ফাইল তৈরি করুন put-script: open sftp://user:password@host; put local-file.name; exit রান করার চেয়ে lftp -f put-script কম্যান্ড লাইনে আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড থাকতে হবে না এবং আপনার স্ক্রিপ্ট ফাইলে সীমাবদ্ধ অনুমতি সেট আপ করতে পারেন।
ওবরণভস্কি

@obaranovsky এটি একটি ভাল ধারণা। আমি ভাবছি যদি আমি এটির পরিবেশের পরিবর্তনশীলটিকে ওরফে বা কোনও ফাংশন হিসাবে যুক্ত করে থাকি তবে এটি কি অন্য ব্যবহারকারীদের থেকে লুকানো নিরাপদ এবং সম্ভব হবে?
sdkks

1
অনেক সহজ করতে lftpনিয়ে জগাখিচুড়ি চেয়ে sftpএবং sshpass। ভাল উত্তর.
গড়পড়তা

53

প্রত্যাশা ব্যবহারের জন্য দুর্দান্ত একটি প্রোগ্রাম।

উবুন্টু এ এটি ইনস্টল করুন:

sudo apt-get install expect

একটি CentOS মেশিনে এটি ইনস্টল করুন:

yum install expect

বলুন আপনি একটি এসফটিপি সার্ভারের সাথে সংযোগ স্থাপন করতে চান এবং তারপরে আপনার স্থানীয় মেশিন থেকে দূরবর্তী এসএফটি সার্ভারে একটি স্থানীয় ফাইল আপলোড করতে চান

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

এটি সার্ভারের সাথে আপনার পাসওয়ার্ডের সাথে একটি এসফ্টপ সংযোগ খুলবে।

তারপরে এটি যে ডিরেক্টরিতে আপনার ফাইল আপলোড করতে চান সেখানে যান "লগডাইরেক্টরি"

এটি স্থানীয় ডিরেক্টরি থেকে / ভার / লগ / এ থাকা ফাইলের নাম ফাইলের সাথে একটি লগ ফাইল আপলোড করে। রিমোট সার্ভারের "লগডাইরেক্টরি" এ লগ করুন


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

ধন্যবাদ. আমি আপনার উত্তর অনুসন্ধানের মাধ্যমে খুঁজে পেয়েছি, এটি ব্যবহার করেছি এবং প্রত্যাশার সাথে সফলভাবে একটি স্ক্রিপ্ট তৈরি করেছি। সদ্য স্ক্রিপ্টটি সামর্থ্যের জন্য পোস্ট করেছেন
রিজিস্টার

আপনার জবাব দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ, আমি ইতিমধ্যে এটি উত্সাহিত করেছি :)
অনুভব

আমি এটি ssh ব্যক্তিগত কী এর পাসফ্রেজ প্রবেশ করার জন্য ব্যবহার করছি using সমস্ত সার্ভারে একই পাবলিক কী লাগানো এবং পর্যায়ক্রমে কেবল ব্যক্তিগত কী পাসফ্রেজ ঘোরানো হ্যান্ডিয়ার is
sdkks

24

শেল স্ক্রিপ্টে আপনি lftp ইন্টারেক্টিভভাবে ব্যবহার করতে পারেন যাতে পাসওয়ার্ডটি .bash_history এ সংরক্ষণ করা হয় না বা নিম্নলিখিতগুলি দ্বারা অনুরূপ:

vi test_script.sh

আপনার ফাইলে নিম্নলিখিতগুলি যুক্ত করুন:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

এবং আপনার পুট ফাইল টাইপিংয়ের জন্য হোস্ট, ব্যবহারকারী, পাস এবং ডিরেক্টরি সম্পাদনা করার পরে vi সম্পাদকটি লিখুন / প্রস্থান করুন :wqhenতখন আপনার স্ক্রিপ্টটি কার্যকরযোগ্য করে নিন chmod +x test_script.shএবং এটি সম্পাদন করুন ./test_script.sh


2
বিদ্যমান ফাইলটি ওভাররাইট করতে, lftp এর পরে "সেট এক্সফার: ক্লোবার অন" যুক্ত করুন << END_ScriptT
বালাজি নাটারাজন

17

সার্ভারের মধ্যে ফাইল সংক্রমণ সুরক্ষার জন্য আমাকে সম্প্রতি ftp থেকে sftp এ সরে যেতে বলা হয়েছিল। আমরা টেকটিকা এসএসএইচ প্যাকেজটি ব্যবহার করছি, --passwordএতে কমান্ড লাইনে পাসওয়ার্ড দেওয়ার বিকল্প রয়েছে ।

উদাহরণ: sftp --password="password" "userid"@"servername"

ব্যাচের উদাহরণ:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

আমি ভেবেছিলাম আমার এই তথ্যটি ভাগ করা উচিত, যেহেতু আমি বিভিন্ন ওয়েবসাইটের দিকে তাকিয়েছিলাম সাহায্য কমান্ড ( sftp -h) চালানোর আগে , এবং আমি পাসওয়ার্ড বিকল্পটি দেখে অবাক হয়েছিলাম।


9
আপনার জন্য ভাল পরামর্শ। তবে এটির জন্য আপনাকে কমান্ড লাইনে পাসওয়ার্ডটি পাস করতে হবে এবং সিস্টেম psকমান্ডের মধ্যে থাকা যে কেউ আপনার পাসওয়ার্ডটি দেখতে পাবে।
অনুভব

4
আমি যে চেষ্টা করেছি, আমি পেয়েছিলামunknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200

1
@Ihue সম্ভবত কারণ আপনার টেকিয়া এসএসএইচ প্রয়োজন, ওপেনএসএসএইচ নয়
qris

17

আপনি পাসওয়ার্ড কম প্রমাণীকরণ সক্ষম করে ওভাররাইড করতে পারেন। তবে এটির আগে আপনাকে কীগুলি (পাব, বেসরকারী) ইনস্টল করা উচিত।

স্থানীয় সার্ভারে নিম্নলিখিত কমান্ডগুলি প্রয়োগ করুন।

Local $> ssh-keygen -t rsa 

অনুরোধ করা সমস্ত বিকল্পের জন্য ENTER টিপুন। কোনও মান টাইপ করার প্রয়োজন নেই।

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

নিম্নলিখিত কমান্ডটি ব্যবহার করে দূরবর্তী সার্ভারের সাথে সংযুক্ত করুন

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

দূরবর্তী সার্ভারে নিম্নলিখিত কমান্ডগুলি প্রয়োগ করুন

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

পাসওয়ার্ড-কম প্রমাণীকরণ পরীক্ষা করতে স্থানীয় সার্ভারে নিম্নলিখিত কমান্ডটি কার্যকর করুন। এটি পাসওয়ার্ড ছাড়াই সংযুক্ত হওয়া উচিত।

$> ssh user@targetmachine

1
আপনার উত্তরের জন্য +1 তবে প্রশ্নটি সরকারী / ব্যক্তিগত কী ছাড়াই এটি করা সম্পর্কে।
অনুভা


কৌতূহলের বাইরে এই কমান্ডটি lftp -p ${port} -u ${login_id},${password} ${ip_number}শেল স্ক্রিপ্ট থেকে চালিত হলে তাদের কোথায় ছাপবে? এসএসপাস বাদে আপনি কীভাবে সমাধান করেছেন?
শ্রিনিভি

আমার কাছে ম্যাক এবং লিনাক্স উভয়ই থেকে নেই lftpএবং নির্ভর করে sshpass
অনুভা

খাঁটি সোনা. ধন্যবাদ! :)
নিকোলে তেসেনকোভ

7

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


5

পাসওয়ার্ড জিজ্ঞাসা করার জন্য এসএফটিপি অপেক্ষা করার জন্য বাশ প্রোগ্রামটি এটির সাথে পাঠান:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

আপনার প্রম্পটটি কী পেতে পারে তার সাথে মিল রাখতে আপনাকে প্রত্যাশা ইনস্টল করতে হবে, 'পাসওয়ার্ড' এর শব্দটি ছোট হাতের 'পি' তে পরিবর্তন করতে হবে। এখানে সমস্যাগুলি হ'ল এটি আপনার পাসওয়ার্ডটি ফাইলের সরল পাঠ্যে পাশাপাশি কমান্ডের ইতিহাসেও প্রকাশ করে। যা প্রায়শই প্রথম স্থানে পাসওয়ার্ড রাখার উদ্দেশ্যকে পরাস্ত করে।


+1 তবে আমি মনে করি আপনি এই পদ্ধতির সাথে সমস্যাগুলি কী তা স্পষ্টভাবে জানিয়ে দিয়েছেন।
অনুভা

5

আপনি এটির জন্য sshpass ব্যবহার করতে পারেন। নীচে পদক্ষেপ দেওয়া হল

  1. উবুন্টুর জন্য এসএসপাস ইনস্টল করুন - sudo apt-get install sshpass
  2. উবুন্টু -> এসএসএস ব্যবহারকারী @ আইপি -> 'হ্যাঁ' লিখলে এটি প্রথমবার হলে আপনার জানা-হোস্ট ফাইলে রিমোট আইপি যুক্ত করুন
  3. এর জন্য scp এবং sshpass এর সম্মিলিত কমান্ড দিন। নীচে রিমোট টমক্যাটে যুদ্ধের জন্য একটি নমুনা কোড দেওয়া আছে sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.