ฉันรู้ว่าไม่แนะนำ แต่เป็นไปได้หรือไม่ที่จะส่งรหัสผ่านของผู้ใช้ไปยัง scp?
ฉันต้องการคัดลอกไฟล์ผ่าน scp ซึ่งเป็นส่วนหนึ่งของงานแบ็ตช์และแน่นอนเซิร์ฟเวอร์ที่รับต้องใช้รหัสผ่านและไม่ฉันไม่สามารถเปลี่ยนการรับรองความถูกต้องด้วยคีย์ได้อย่างง่ายดาย
ฉันรู้ว่าไม่แนะนำ แต่เป็นไปได้หรือไม่ที่จะส่งรหัสผ่านของผู้ใช้ไปยัง scp?
ฉันต้องการคัดลอกไฟล์ผ่าน scp ซึ่งเป็นส่วนหนึ่งของงานแบ็ตช์และแน่นอนเซิร์ฟเวอร์ที่รับต้องใช้รหัสผ่านและไม่ฉันไม่สามารถเปลี่ยนการรับรองความถูกต้องด้วยคีย์ได้อย่างง่ายดาย
คำตอบ:
ใช้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 sshpassyum install sshpassport install sshpassbrew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rbapt-get install sshpass
                    yum -y install sshpass
                    sshpass -f passwdfile` scp [... ] . This way, the password won't show up in ps` ฯลฯ และคุณสามารถป้องกันรหัสผ่านด้วยการอนุญาตไฟล์
                    เพียงสร้างคีย์ 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
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>เพื่อคัดลอกคีย์บนเซิร์ฟเวอร์ระยะไกล
                    หากคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์จาก Windows scp รุ่น ("pscp") รุ่น Putty ให้คุณส่งรหัสผ่านด้วย-pwพารามิเตอร์
pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(ฉันเกลียดการใช้ผงสำหรับอุดรูแบบนี้ แต่ใช้งานได้)
                    curl สามารถใช้เป็นทางเลือกแทน scp เพื่อคัดลอกไฟล์และสนับสนุนรหัสผ่านใน commandline
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
              scpต้องรอ 30+ วินาทีเพื่อให้ฉันใส่รหัสผ่าน แต่ใช้curlงานได้ทันที
                    คุณสามารถใช้สคริปต์ 'คาดหวัง' บนยูนิกซ์ / เทอร์มินัล
ตัวอย่างเช่นสร้าง '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 
ฉันหวังว่าจะช่วย
นี่คือตัวอย่างของวิธีการใช้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;
}
              ไม่มีใครพูดถึงมัน แต่Putty scp (pscp) มีตัวเลือก -pw สำหรับรหัสผ่าน
เอกสารสามารถพบได้ที่นี่: https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp
คุณอาจใช้ssh-copy-idเพื่อเพิ่มคีย์ ssh:
$which ssh-copy-id #check whether it exists
หากมีอยู่:
ssh-copy-id  "user@remote-system"
              เมื่อคุณตั้งค่า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คำสั่งโดยไม่มีรหัสผ่าน
ตรวจสอบให้แน่ใจว่าคุณมีเครื่องมือ "คาดหวัง" มาก่อนถ้าไม่ทำ
# apt-get install expect
สร้างไฟล์สคริปต์ด้วยเนื้อหาดังต่อไปนี้ (# 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
รันไฟล์สคริปต์ด้วยเครื่องมือ "คาดหวัง"
# expect /root/scriptfile
ต่อไปนี้เป็นตัวอย่างของ 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
              ทางเลือกอื่นคือการเพิ่มพับลิกครึ่งของคีย์ผู้ใช้ลงในไฟล์คีย์ที่ได้รับอนุญาตบนระบบเป้าหมาย บนระบบที่คุณเริ่มการถ่ายโอนจากคุณสามารถเรียกใช้ ssh-agent daemon และเพิ่มไพรเวตครึ่งหนึ่งของคีย์ให้กับเอเจนต์ จากนั้นงานแบ็ตช์สามารถกำหนดค่าให้ใช้ตัวแทนเพื่อรับไพรเวตคีย์แทนการขอรหัสผ่านของคีย์
สิ่งนี้ควรทำในระบบ UNIX / Linux หรือบนแพลตฟอร์ม Windows โดยใช้ pageant และ pscp
โซลูชั่นทั้งหมดที่กล่าวมาข้างต้นสามารถทำงานได้เฉพาะเมื่อคุณติดตั้งแอพหรือคุณควรมีสิทธิ์ของผู้ดูแลระบบในการติดตั้งยกเว้นหรือ 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/
ขั้นตอนในการรับ sshpass สำหรับ rhel / centos 6:
# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass
แหล่งที่มา: https://community.mapr.com/thread/9040
ฉันพบคำตอบที่เป็นประโยชน์จริงๆที่นี่
rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/
ไม่เพียง แต่คุณสามารถส่งรหัสผ่านไปยังที่นั่น แต่ยังจะแสดงแถบความคืบหน้าเมื่อทำการคัดลอก ยอดเยี่ยมจริงๆ