วิธีการรันคำสั่ง sftp ด้วยรหัสผ่านจาก Bash script


173

ฉันต้องการถ่ายโอนไฟล์บันทึกไปยังโฮสต์ระยะไกลโดยใช้sftpจากโฮสต์ Linux ฉันได้รับข้อมูลประจำตัวสำหรับสิ่งเดียวกันจากกลุ่มปฏิบัติการของฉัน อย่างไรก็ตามเนื่องจากฉันไม่สามารถควบคุมโฮสต์อื่นได้ฉันจึงไม่สามารถสร้างและแบ่งปันคีย์ RSA กับโฮสต์อื่นได้

ดังนั้นมีวิธีการเรียกใช้sftpคำสั่ง (มีชื่อผู้ใช้ / รหัสผ่านให้) จากภายในสคริปต์ทุบตีผ่านงานcronหรือไม่

ฉันพบคำถาม Stack Overflow ที่คล้ายกันระบุรหัสผ่านเป็น sftp ในสคริปต์ Bashแต่ไม่มีคำตอบที่น่าพอใจสำหรับปัญหาของฉัน

คำตอบ:


178

คุณมีตัวเลือกอื่นนอกเหนือจากการใช้การรับรองความถูกต้องของรหัสสาธารณะ:

  1. ใช้พวงกุญแจ
  2. ใช้sshpass (ปลอดภัยน้อยกว่า แต่น่าจะตรงกับความต้องการของคุณ)
  3. คาดหวังใช้งาน(ปลอดภัยน้อยที่สุดและต้องการรหัสเพิ่ม)

หากคุณตัดสินใจที่จะให้โอกาสกับ sshpass นี่คือตัวอย่างของสคริปต์ที่ใช้งานได้:

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

3
สำหรับใช้งานบน Mac: stackoverflow.com/questions/9102557/…
anubhava

18
ฉันไม่ต้องการส่งออกฉันคิดว่า SSHPASS=password sshpass -e ...ควรทำ.
Jens

9
ฉันสามารถทำสายการบินหนึ่งเดียวเพื่อดาวน์โหลดไฟล์บันทึก:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans

6
@gorus: สายการบินหนึ่งเย็นมาก แต่ฉันไม่ต้องการใช้รหัสผ่านบนบรรทัดคำสั่งเนื่องจากความเสี่ยงในการสอดแนมที่เพิ่มขึ้น
anubhava

8
-oBatchMode=noเป็นชิ้นส่วนที่ขาดหายไปที่สำคัญสำหรับฉัน
richardkmiller

99

อีกวิธีหนึ่งคือใช้ lftp:

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

ข้อเสียของวิธีนี้คือผู้ใช้รายอื่นในคอมพิวเตอร์สามารถอ่านรหัสผ่านจากเครื่องมือเช่นpsและรหัสผ่านสามารถกลายเป็นส่วนหนึ่งของประวัติเชลล์ของคุณ

ทางเลือกที่ปลอดภัยมากขึ้นซึ่งสามารถใช้ได้ตั้งแต่ lftp 4.5.0 คือการตั้งค่าLFTP_PASSWORDตัวแปรสภาพแวดล้อมและการดำเนิน lftp --env-passwordกับ นี่คือตัวอย่างเต็มรูปแบบ:

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

LFTP ยังมีคุณสมบัติการมิเรอร์แบบเย็น (สามารถรวมการลบหลังจากการถ่ายโอนที่ยืนยัน--Remove-source-files):

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

9
+1 สำหรับการแนะนำทางเลือกอื่น แต่เราสามารถหลีกเลี่ยงการระบุรหัสผ่านในบรรทัดคำสั่งได้หรือไม่
anubhava

1
ลงคะแนนให้แสดงรหัสผ่านแก่ทุกคนในคอมพิวเตอร์เครื่องเดียวกัน
Aaron Digulla

10
คุณสามารถสร้างไฟล์สคริปต์สำหรับ lftp ด้วยวิธีนี้คุณจะไม่ต้องให้รหัสผ่านในบรรทัดคำสั่ง สร้างไฟล์put-script: open sftp://user:password@host; put local-file.name; exit ทำงานมากกว่าlftp -f put-script ด้วยวิธีนี้คุณไม่จำเป็นต้องมีชื่อผู้ใช้และรหัสผ่านในบรรทัดคำสั่งและสามารถตั้งค่าการอนุญาตที่ จำกัด ให้กับไฟล์สคริปต์ของคุณ
obaranovsky

@obananovsky นั่นเป็นความคิดที่ดี ฉันสงสัยว่าฉันจะเพิ่มสิ่งนี้ในตัวแปรสภาพแวดล้อมของฉันเป็นนามแฝงหรือฟังก์ชั่นมันจะปลอดภัยและเป็นไปได้ที่จะซ่อนจากผู้ใช้รายอื่นหรือไม่?
sdkks

1
ไกลได้ง่ายขึ้นที่จะทำlftpกว่ายุ่ง ๆ กับและsftp sshpassคำตอบที่ดี.
MeanEYE

53

คาดว่าเป็นโปรแกรมที่ยอดเยี่ยมที่จะใช้

บน Ubuntu ติดตั้งด้วย:

sudo apt-get install expect

บนเครื่อง CentOS ติดตั้งด้วย:

yum install expect

ให้บอกว่าคุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ sftp แล้วอัปโหลดไฟล์ในเครื่องจากเครื่องของคุณไปยังเซิร์ฟเวอร์ sftp ระยะไกล

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

นี่เป็นการเปิดการเชื่อมต่อ sftp ด้วยรหัสผ่านของคุณไปยังเซิร์ฟเวอร์

จากนั้นไปที่ไดเรกทอรีที่คุณต้องการอัปโหลดไฟล์ในกรณีนี้ "logdirectory"

สิ่งนี้จะอัปโหลดไฟล์บันทึกจากไดเรกทอรีท้องถิ่นที่ / var / log / ด้วยชื่อไฟล์ที่เป็น file.log ไปยัง "logdirectory" บนเซิร์ฟเวอร์ระยะไกล


ขอบคุณสำหรับคำตอบของคุณฉันคาดหวังว่าจะเป็นหนึ่งในตัวเลือกของฉันสำหรับการทำงานนี้ให้สำเร็จ
anubhava

ขอบคุณ. ฉันพบคำตอบของคุณผ่านการค้นหาใช้มันและสร้างสคริปต์ให้สำเร็จตามที่คาดหวัง เพิ่งโพสต์สคริปต์สำหรับ poterity
rezizter

ขอบคุณมากสำหรับคำตอบของคุณฉันได้
อัปเกรด

ฉันใช้สิ่งนี้เพื่อป้อนวลีรหัสผ่านสำหรับคีย์ส่วนตัว ssh มันง่ายกว่าที่จะใส่กุญแจสาธารณะเดียวกันบนเซิร์ฟเวอร์ทั้งหมดและเพียงแค่หมุนข้อความรหัสผ่านส่วนตัวเป็นระยะ
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 แก้ไขหลังจากที่คุณแก้ไขโฮสต์ของผู้ใช้ผ่านและไดเรกทอรีสำหรับใส่ไฟล์ของคุณพิมพ์:wqจากนั้นให้ปฏิบัติการสคริปต์ของคุณและดำเนินการได้chmod +x test_script.sh./test_script.sh


2
หากต้องการเขียนทับไฟล์ที่มีอยู่ให้เพิ่ม "set xfer: clobber on" หลังจาก lftp << END_SCRIPT
Balaji Natarajan

17

ฉันเพิ่งถูกขอให้เปลี่ยนจาก ftp เป็น sftp เพื่อความปลอดภัยในการส่งไฟล์ระหว่างเซิร์ฟเวอร์ เรากำลังใช้แพ็คเกจ Tectia SSH ซึ่งมีตัวเลือก--passwordในการส่งรหัสผ่านในบรรทัดคำสั่ง

ตัวอย่าง: sftp --password="password" "userid"@"servername"

ตัวอย่างแบทช์:

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

ฉันคิดว่าฉันควรแบ่งปันข้อมูลนี้เนื่องจากฉันดูเว็บไซต์ต่าง ๆ ก่อนที่จะเรียกใช้คำสั่ง help ( sftp -h) และฉันรู้สึกประหลาดใจเมื่อเห็นตัวเลือกรหัสผ่าน


9
+1 สำหรับคุณคำแนะนำที่ดี อย่างไรก็ตามสิ่งนี้จะทำให้คุณต้องส่งรหัสผ่านบนบรรทัดคำสั่งและทุกคนในระบบที่ทำpsคำสั่งจะสามารถเห็นรหัสผ่านของคุณได้
anubhava

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 อาจเป็นเพราะคุณต้องการTechia SSHไม่ใช่ OpenSSH
qris

17

คุณสามารถแทนที่ได้ด้วยการเปิดใช้งานการพิสูจน์ตัวตนด้วยรหัสผ่านน้อยลง แต่คุณควรติดตั้งคีย์ (pub, priv) ก่อนที่จะทำเช่นนั้น

ดำเนินการคำสั่งต่อไปนี้ที่เซิร์ฟเวอร์ภายใน

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 สำหรับคำตอบของคุณ แต่คำถามเกี่ยวกับการดำเนินการโดยไม่มีคีย์สาธารณะ / ส่วนตัว
anubhava

อ๊ะ .. เพิ่งเห็นข้อ จำกัด ในการแชร์คีย์ :)
SriniV

คำสั่งนี้จะออกมาจากความอยากรู้lftp -p ${port} -u ${login_id},${password} ${ip_number}เมื่อใดที่เรียกใช้จากเชลล์สคริปต์ คุณแก้ปัญหานอกเหนือจาก sshpass อย่างไร?
SriniV

ฉันไม่มีlftpและพึ่งพาsshpassจาก Mac และ Linux ทั้งคู่
anubhava

ทองคำบริสุทธิ์ ขอบคุณ! :)
Nikolay Tsenkov

7

รวม sshpass กับไฟล์ข้อมูลรับรองที่ถูกล็อคและในทางปฏิบัติมันปลอดภัยเท่ากับอะไร - ถ้าคุณมีรูทที่กล่องอ่านไฟล์ข้อมูลรับรองการเดิมพันทั้งหมดจะปิดอยู่ดี


5

โปรแกรมทุบตีเพื่อรอ sftp เพื่อขอรหัสผ่านจากนั้นส่งไปตาม:

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

คุณอาจจำเป็นต้องติดตั้งคาดหวังเปลี่ยนถ้อยคำของ 'รหัสผ่าน' เป็นตัวพิมพ์เล็ก 'p' เพื่อให้ตรงกับสิ่งที่คุณได้รับพรอมต์ ปัญหาที่นี่คือมันเปิดเผยรหัสผ่านของคุณในข้อความธรรมดาในไฟล์เช่นเดียวกับในประวัติคำสั่ง ซึ่งเกือบจะเอาชนะวัตถุประสงค์ของการมีรหัสผ่านในตอนแรก


+1 แต่ฉันคิดว่าคุณระบุไว้อย่างชัดเจนว่าปัญหานี้เกิดจากวิธีการนี้อย่างไร
anubhava

5

คุณสามารถใช้ sshpass ได้ ด้านล่างเป็นขั้นตอน

  1. ติดตั้ง sshpass สำหรับ Ubuntu - sudo apt-get install sshpass
  2. เพิ่ม IP จากระยะไกลไปยังไฟล์โฮสต์ที่รู้จักของคุณหากเป็นครั้งแรกสำหรับ Ubuntu -> ssh user @ IP -> ป้อน 'ใช่'
  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.