จะส่งรหัสผ่านไปที่ scp ได้อย่างไร


297

ฉันรู้ว่าไม่แนะนำ แต่เป็นไปได้หรือไม่ที่จะส่งรหัสผ่านของผู้ใช้ไปยัง scp?

ฉันต้องการคัดลอกไฟล์ผ่าน scp ซึ่งเป็นส่วนหนึ่งของงานแบ็ตช์และแน่นอนเซิร์ฟเวอร์ที่รับต้องใช้รหัสผ่านและไม่ฉันไม่สามารถเปลี่ยนการรับรองความถูกต้องด้วยคีย์ได้อย่างง่ายดาย


2
ดูเพิ่มเติม (ในภายหลัง) คำถาม: stackoverflow.com/questions/1462284/…โดยที่หนึ่งคำตอบพูดถึงวิธีที่เป็นไปได้อีกวิธีหนึ่งในการทำเช่นนี้ (หมายเหตุ: นี้ไม่ได้เป็นคำถามที่ซ้ำกัน - มันเป็นต้นฉบับที่ซ้ำกันอื่น ๆ .)
โจนาธาน Leffler

คำตอบ:


35

คุณสามารถเขียนสคริปต์ด้วยเครื่องมืออย่างที่คาดหวัง (มีการผูกที่มีประโยชน์เช่นPexpectสำหรับ Python)


1
ลิงก์ไปยังexpect.nist.gov ใช้งานไม่ได้ อาจจะเป็นอย่างนี้บ้าง: expect.sourceforge.net
Katapofatico

sudo apt-get install คาดหวัง
SDsolar

>> brew info sshpass ข้อผิดพลาด: ไม่มีสูตรที่ใช้ชื่อ "sshpass" เราจะไม่เพิ่ม sshpass เพราะทำให้ผู้ใช้มือใหม่ SSH ง่ายเกินไปที่จะทำลายความปลอดภัยของ SSH ;)
Lukas NP Egger

528

ใช้sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

รหัสผ่านจะไม่แสดงในประวัติทุบตี

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

ข้างต้นคัดลอกเนื้อหาของเส้นทางจากโฮสต์ระยะไกลไปยังท้องถิ่นของคุณ

ติดตั้ง:

  • อูบุนตู / เดเบียน
    • apt install sshpass
  • CentOS / Fedora
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • แม็ค w / ชง
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
ใน Ubuntu 12.04 ใช้งานได้กับฉันโดยใช้เครื่องหมายคำพูดเดียวผ่านรหัสผ่าน (เช่น 'รหัสผ่าน' แทน "รหัสผ่าน")
odedfos

6
@ รหัสแล้ว, ใช่คุณต้องใช้เครื่องหมายคำพูดเดี่ยวเพราะตัวอักษรที่สร้างรหัสผ่านบางตัวอาจมีการตีความพิเศษในการแก้ไขสตริงที่ยกมาสองครั้ง
TerryE

7
นี่คือวิธีที่คุณติดตั้ง sshpassapt-get install sshpass
Jan-Terje Sørensen

6
ใน CentOS มันyum -y install sshpass
jgritty

19
วิธีที่ปลอดภัยที่สุดในการทำเช่นนี้คือไฟล์รหัสผ่านเช่นนี้รายการsshpass -f passwdfile` scp [... ] . This way, the password won't show up in ps` ฯลฯ และคุณสามารถป้องกันรหัสผ่านด้วยการอนุญาตไฟล์
Christopher Schultz

50

เพียงสร้างคีย์ ssh เช่น:

ssh-keygen -t rsa -C "your_email@youremail.com"

คัดลอกเนื้อหาของ~/.ssh/id_rsa.pub และเพิ่มไปยังเครื่องระยะไกล~/.ssh/authorized_keys

ตรวจสอบให้แน่ใจว่าเครื่องระยะไกลมีสิทธิ์0700 for ~./ssh folderและ0600 for ~/.ssh/authorized_keys


35
ตามที่ฉันเขียนไว้: ไม่ฉันไม่สามารถสลับไปใช้การรับรองความถูกต้องด้วยคีย์ได้อย่างง่ายดาย
Argelbargel

3
คุณหมายถึง .authorized_keys มากกว่า authorization_keys?
HelloWorld

2
การใช้งานที่ถูกต้องสำหรับสิ่งนี้จะเป็นสคริปต์ทุบตีที่เรียกใช้ scp / ssh หลายครั้งไปยังเซิร์ฟเวอร์ที่คุณต้องการขอรหัสผ่านสำหรับเซิร์ฟเวอร์ระยะไกล รหัสผ่านจะไม่ปรากฏในประวัติและคุณยังมีความท้าทายสำหรับรหัสผ่าน ... แต่เพียงครั้งเดียวเท่านั้น ฉันไม่ต้องการใช้ไฟล์กุญแจเพราะฉันต้องการรับรองความถูกต้องของผู้ใช้สคริปต์
Wes Grant

2
การใช้ที่ถูกต้องอีกอย่างหนึ่งคือหากคุณไม่สามารถเปิดใช้งานการรับรองความถูกต้องด้วยคีย์บนเป้าหมายได้อย่างง่ายดาย ตัวอย่าง: หนึ่งในผู้ผลิต NAS หลัก - การทำงานร่วมกับ DSM 6.0 ของพวกเขา - ไม่รองรับแม้ในปี 2559 แน่นอนคุณสามารถยุ่งกับไฟล์การกำหนดค่าและหวังว่าการอัปเดตจะไม่เขียนทับอีกครั้ง (การอัปเดต DSM บ่อยครั้ง ) บางครั้ง - โดยเฉพาะอย่างยิ่งเมื่อ OP เขียนไว้อย่างชัดเจนว่าพวกเขารู้แล้วว่ามันไม่เหมาะสม - คนแค่ต้องการทางออก
Aaa

3
คุณควรใช้ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>เพื่อคัดลอกคีย์บนเซิร์ฟเวอร์ระยะไกล
RousseauAlexandre

39

หากคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์จาก Windows scp รุ่น ("pscp") รุ่น Putty ให้คุณส่งรหัสผ่านด้วย-pwพารามิเตอร์

สิ่งนี้ถูกกล่าวถึงในเอกสารประกอบที่นี่


1
กรุณาแสดงตัวอย่าง
SDsolar

นอกจากนี้อาจต้องการเพิ่มไฟล์ C: \ Program (x86) \ PuTTY ในพา ธ ของคุณเพื่อใช้คำสั่งเหล่านี้
SDsolar

1
@ SDsolar นี่เป็นตัวอย่างของไวยากรณ์: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(ฉันเกลียดการใช้ผงสำหรับอุดรูแบบนี้ แต่ใช้งานได้)
genorama

29

curl สามารถใช้เป็นทางเลือกแทน scp เพื่อคัดลอกไฟล์และสนับสนุนรหัสผ่านใน commandline

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

มันค่อนข้างช้ากว่า 'scp' แต่ก็ทำงานได้ดี
Victor

ฉันพบว่าสิ่งนี้จะเร็วขึ้นเมื่อกำหนดค่าปลายทางด้วยความล่าช้าของรหัสผ่านขนาดใหญ่ scpต้องรอ 30+ วินาทีเพื่อให้ฉันใส่รหัสผ่าน แต่ใช้curlงานได้ทันที
Ghost8472

@ Ghost8472 กำหนดค่าใช่ แต่บางครั้งความล่าช้านี้กำลังแก้ไขชื่อโฮสต์และเกิดขึ้นกับ sftp ด้วย
mckenzm

1
ผมได้ "ขด: (1) พิธีสาร 'SFTP' ได้รับการสนับสนุนหรือปิดใช้งานใน libcurl"
kronuus

21

คุณสามารถใช้สคริปต์ 'คาดหวัง' บนยูนิกซ์ / เทอร์มินัล

ตัวอย่างเช่นสร้าง 'test.exp':

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

เรียกใช้สคริปต์

expect test.exp 

ฉันหวังว่าจะช่วย


7
วิชาบังคับก่อน: คาดหวังว่าจะได้รับการติดตั้ง sudo apt-get
SDsolar

10

นี่คือตัวอย่างของวิธีการใช้expectเครื่องมือ:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
สิ่งนี้อยู่ใน perl ขอโทษที่ฉันไม่ได้เขียนมัน (5 ปีที่ผ่านมา :))
Espo

8

ไม่มีใครพูดถึงมัน แต่Putty scp (pscp) มีตัวเลือก -pw สำหรับรหัสผ่าน

เอกสารสามารถพบได้ที่นี่: https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp


9
มันถูกกล่าวถึงในคำตอบของ user524607 เมื่อ 5 ปีที่แล้ว
Barmar

พบและกำลังเพิ่มไฟล์ C: \ Program (x86) \ PuTTY ในพา ธ ของฉัน
SDsolar

3

คุณอาจใช้ssh-copy-idเพื่อเพิ่มคีย์ ssh:

$which ssh-copy-id #check whether it exists

หากมีอยู่:

ssh-copy-id  "user@remote-system"

3

เมื่อคุณตั้งค่าssh-keygenตามที่อธิบายไว้ข้างต้นคุณสามารถทำได้

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

หากคุณต้องการลดการพิมพ์แต่ละครั้งคุณสามารถแก้ไข.bash_profileไฟล์และใส่ได้

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

source ~/.bash_profileจากนั้นก็ทำ terminal ของคุณ หลังจากนั้นหากคุณพิมพ์remote_scpเทอร์มินัลของคุณควรรันscpคำสั่งโดยไม่มีรหัสผ่าน


2
  1. ตรวจสอบให้แน่ใจว่าคุณมีเครื่องมือ "คาดหวัง" มาก่อนถ้าไม่ทำ

    # apt-get install expect

  2. สร้างไฟล์สคริปต์ด้วยเนื้อหาดังต่อไปนี้ (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. รันไฟล์สคริปต์ด้วยเครื่องมือ "คาดหวัง"

    # expect /root/scriptfile


1

ต่อไปนี้เป็นตัวอย่างของ Linux / Python / คาดหวังของคนจนโดยอ้างอิงจากบล็อกโพสต์นี้: การอัพเกรดเชลล์อย่างง่ายเป็น TTY แบบโต้ตอบทั้งหมดหอยอัพเกรดที่ง่ายต่อการทาง TTYฉันต้องการสิ่งนี้สำหรับเครื่องเก่าที่ไม่สามารถติดตั้ง Expect หรือเพิ่มโมดูลใน Python

รหัส:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

เอาท์พุท:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

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

สิ่งนี้ควรทำในระบบ UNIX / Linux หรือบนแพลตฟอร์ม Windows โดยใช้ pageant และ pscp


4
คำถามกล่าวว่าเขาไม่สามารถใช้การรับรองความถูกต้องด้วยรหัส
Barmar

2
นอกจากนี้ถ้าเป็นฉันฉันคิดว่าฉันไม่สามารถเปลี่ยนเซิร์ฟเวอร์อื่น - ทั้งหมดที่ฉันต้องการคือการคัดลอกไฟล์
SDsolar

-1

โซลูชั่นทั้งหมดที่กล่าวมาข้างต้นสามารถทำงานได้เฉพาะเมื่อคุณติดตั้งแอพหรือคุณควรมีสิทธิ์ของผู้ดูแลระบบในการติดตั้งยกเว้นหรือ sshpass

ฉันพบลิงค์ที่มีประโยชน์มากนี้เพียงแค่เริ่ม scp ในพื้นหลัง

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
วิธีการใช้ scp ในพื้นหลังใส่รหัสผ่าน?
thomas.han


-9

ฉันพบคำตอบที่เป็นประโยชน์จริงๆที่นี่

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

ไม่เพียง แต่คุณสามารถส่งรหัสผ่านไปยังที่นั่น แต่ยังจะแสดงแถบความคืบหน้าเมื่อทำการคัดลอก ยอดเยี่ยมจริงๆ


22
และคุณระบุรหัสผ่านที่นี่อย่างแม่นยำเพียงใด?
infografnet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.