ชื่อผู้ใช้และรหัสผ่านในบรรทัดคำสั่งด้วย sshfs


15

ฉันกำลังสร้างสคริปต์สำรองขนาดเล็กโดยใช้sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

มีวิธีการรวมรหัสผ่านในคำสั่งนี้หรือไม่?

หรือมีโซลูชันการถ่ายโอนไฟล์อื่นที่สามารถใช้รหัสผ่านการเข้าสู่ระบบอื่นนอกเหนือจาก FTP / SFTP ได้หรือไม่


4
คุณสามารถใช้ ssh-gkeygen เพื่อสร้างคู่คีย์ RSA จากนั้นกำหนดค่า ssh (ไคลเอ็นต์และเซิร์ฟเวอร์) เพื่อใช้การตรวจสอบสิทธิ์ RSA คุณเคยทำสิ่งนี้มาก่อนสำหรับการรับรองความถูกต้อง "ปกติ" หรือไม่?
airhuff

ใช่ แต่ฉันต้องเปลี่ยนวิธีการที่เซิร์ฟเวอร์กำลังเชื่อมต่อผ่าน ssh .. เท่าที่ฉันรู้ว่าการรับรองความถูกต้องสามารถใช้คีย์หรือเข้าสู่ระบบ / รหัสผ่านไม่ได้ทั้งสองอย่างในเวลาเดียวกัน ..
Zaza

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

คำตอบ:


11

-o password_stdinดูเหมือนว่าจะไม่ทำงานในทุกระบบเช่น freeBSD เป็นต้น

นอกจากนี้คุณยังสามารถใช้expect ล่ามก็ควรทำงานกับ sshfs และควรทำเคล็ดลับ

อีกวิธีหนึ่งคือsshpassสมมติว่าคุณกำลังสำรองข้อมูลไดเรกทอรี / var / www

สำรอง:

name=$(date '+%y-%m-%d')
mkdir /backup/$name && tar -czvf /backup/$name/"$name.tar.gz" /var/www

อัปโหลดไฟล์สำรองข้อมูลไปยังเซิร์ฟเวอร์สำรอง

sshpass -p "your_password" scp -r backup_user@target_ip:/home/ /backup/$name

ดังนั้นมันจะอัปโหลดไดเรกทอรีพร้อมการสำรองข้อมูลของวันนี้

แต่ก็ยังตามที่ได้กล่าวไว้สูงกว่าวิธีที่ดีที่สุด (ปลอดภัยและเรียบง่าย) คือการใช้คู่คีย์ ssh
ความไม่สะดวกเพียงอย่างเดียวคือคุณต้องผ่านกระบวนการสร้างคีย์ทุกครั้งบนเซิร์ฟเวอร์ คุณต้องจับคู่ แต่มันจะดีกว่าการเก็บรหัสผ่านในรูปแบบข้อความล้วนบนเซิร์ฟเวอร์ทั้งหมดที่คุณต้องการสำรองข้อมูล :) การ

สร้าง Key Pair ให้ถูกวิธี

  • บนเซิร์ฟเวอร์ท้องถิ่น

    ssh-keygen -t rsa
    
  • บนเซิร์ฟเวอร์ระยะไกล

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • การอัปโหลดคีย์สาธารณะที่สร้างไปยังเซิร์ฟเวอร์ระยะไกล

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • ตั้งค่าการอนุญาตบนเซิร์ฟเวอร์ระยะไกล

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • เข้าสู่ระบบ

    ssh root@remote_servers_ip
    
  • การเปิดใช้งาน SSH Protocol v2

    ไม่ใส่ข้อคิดเห็น "Protocol 2" ใน / etc / ssh / sshd_config

  • เปิดใช้งานการอนุญาตคีย์สาธารณะใน sshd

    uncomment "PubkeyAuthentication ใช่" ใน / etc / ssh / sshd_config

  • ถ้า StrictModes ถูกตั้งค่าเป็น yes ใน / etc / ssh / sshd_config

    restorecon -Rv ~/.ssh
    

14

ตามคู่มือมีตัวเลือก-o password_stdinที่อาจอนุญาตให้อ่านรหัสผ่านจากอินพุตมาตรฐานซึ่งอาจเป็นการเปลี่ยนเส้นทาง ฉันไม่เคยใช้มันดังนั้นฉันจึงคาดเดา

ที่กล่าวว่าฉันขอแนะนำอย่างยิ่งต่อโซลูชั่นดังกล่าวซึ่งไม่ปลอดภัยโดยเนื้อแท้

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


ทุกคนสามารถให้ตัวอย่างการทำงานของโซลูชันนี้ได้หรือไม่ ฉันลองทำสิ่งต่อไปนี้ แต่มันไม่ทำงาน:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE

FYI ฉันควรจะกล่าวถึงว่าฉันใช้รหัส SSH ที่ป้องกันด้วยรหัสผ่าน ฉันสามารถทำให้มันทำงานโดยใช้คำตอบที่ @ nathan-s-watson-haigh พบได้ที่นี่: unix.stackexchange.com/questions/128974/…
MikeyE

ฉันไม่มีสภาพแวดล้อมการจับคู่ใด ๆ ที่จะทำให้ฉันสามารถทดสอบ ssfs-mount ด้วยคีย์ SSH ที่ป้องกันด้วยรหัสผ่าน อย่างไรก็ตามสิ่งที่ทำให้ฉันประทับใจในคำสั่งของคุณในตอนแรกคือฉันไม่เห็น-o password_stdinตัวเลือกใด ๆ
xhienne

ขอบคุณสำหรับการเข้า ฉันลองคำสั่งต่อไปนี้ตอนนี้และมันไม่ได้ขอรหัสผ่าน แต่มันก็ไม่ได้ส่งคืน หมายความว่ามันแค่รอให้คำสั่งดำเนินการจนเสร็จไม่มีการแสดงพรอมต์คำสั่ง ฉันลองใช้คำสั่ง: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS ฉันใช้ Debian Buster PPS ใช้งานได้ แต่ขอรหัสผ่าน:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE

11

ไปป์"sshfs password"ด้วย<<<เพื่อ-o password_stdinทำงานกับ bash:

sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< "sshfs password"

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ .. ใช้ได้กับทุกระบบปฏิบัติการ Linux
argon

ดังนั้นวิธีที่จะวางไว้ในไฟล์ mnt-media.mount สำหรับการติดตั้งอัตโนมัติด้วย systemd?
JoãoJosé

หนึ่งความคิดเห็นเล็กน้อยพิเศษ: หากรหัสผ่านของคุณมีอักขระ BASH พิเศษในนั้น (เช่น bang (!)) ดังนั้นคุณควรใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่สำหรับรหัสผ่าน
Kyle Challis

5
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin

ตัวเลือก "-o password_stdin" คือสิ่งที่ช่วยให้คุณไพพ์รหัสผ่านของคุณ

ดังกล่าวว่าคีย์เป็นตัวเลือกที่ดีกว่าเว้นแต่ผู้ให้บริการของคุณจะไม่อนุญาตให้คุณใช้ sftp (นี่เป็นหนึ่งในความล้มเหลวที่น่าสังเกตของ WP Engine)


คุณช่วยอธิบายคำตอบของคุณให้กระจ่างขึ้นได้ไหม มีเพียงบรรทัดเดียวเท่านั้นที่ไม่นับรวมในคำตอบที่ดี SE
Romeo Ninov

@RomeoNinov ฉันจะบอกว่าโพสต์นี้ตอบคำถามได้ดีพอ ไม่ใช่ทุกคนที่มีแนวโน้มที่จะเขียนนวนิยายอธิบายว่าทำไมสิ่งที่ชัดเจนนั้นชัดเจน
Satō Katsura

@SatoKatsura ขอบคุณ ฉันถึงความท้าทายแล้ว
iateadonut

2

สคริปต์เมานต์:

#!/bin/bash
server=<host>
user=<username>
pass=<password>
root=<hostpath>
mount=$(pwd)/sshfs

type sshfs >/dev/null 2>&1 || { echo >&2 "sshfs required"; exit 1; }
type sshpass >/dev/null 2>&1 || { echo >&2 "sshpass required"; exit 1; }

mkdir -p $mount

SSHPASS="$pass" sshfs $server:$root $mount -o ssh_command="sshpass -e ssh -l $user"

ยกเลิกการเชื่อมต่อ:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount

1

สิ่งหนึ่งที่ต้องจำไว้คือถ้าคุณใช้-o password_stdinตัวเลือกมันอาจดูเหมือนจะไม่ทำงานเพราะ sshfs จะถามว่าจะเชื่อมต่อกับโฮสต์หรือไม่ (ถ้าเป็นครั้งแรกที่คุณเชื่อมต่อและไม่ได้เพิ่ม ไปยังไฟล์โฮสต์ที่รู้จัก) หากคุณใช้งานเป็นชุดคุณจะไม่เห็นคำสั่ง sshfs วิธีหลีกเลี่ยงปัญหานี้คือ:

  1. เพิ่ม-o StrictHostKeyChecking=noตัวเลือกเพื่อ sshfs หรือ
  2. รัน sshfs ด้วยตนเองหนึ่งครั้งเพื่อเพิ่มโฮสต์ไปยังไฟล์โฮสต์ที่รู้จัก

0

สคริปต์อัตโนมัติเพื่อเชื่อมต่อ sftp กับ sshfs

#!/bin/bash
expect <<END
spawn sshfs sftpuser@ip:/folder /mnt/folder -p 22 -o password_stdin
send "password\r"
expect eof
END
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.