Tên người dùng và mật khẩu trong dòng lệnh với sshfs


15

Tôi đang tạo một tập lệnh sao lưu nhỏ bằng cách sử dụng sshfs:

sshfs backup_user@target_ip:/home /mnt/backup

Có cách nào để bao gồm mật khẩu trong lệnh này không?

Hoặc có một giải pháp chuyển tập tin nào khác mà mật khẩu đăng nhập có thể được đưa vào ngoài FTP / SFTP không?


4
Bạn có thể sử dụng ssh-gkeygen để tạo cặp khóa RSA sau đó định cấu hình ssh (máy khách và máy chủ) để sử dụng xác thực RSA. Bạn đã làm điều này trước đây để xác thực ssh "thông thường"?
airhuff

có nhưng sau đó tôi phải thay đổi cách các máy chủ kết nối qua ssh .. theo tôi biết xác thực có thể dựa trên khóa hoặc đăng nhập / mật khẩu không phải cả hai cùng một lúc ..
Zaza

2
Họ có thể là cả hai. Họ thường là như vậy. Bằng cách này, một người dùng mới được tạo có thể đẩy khóa của họ trên máy chủ bằng cách nhập mật khẩu của họ. Sau đó, họ sử dụng chìa khóa của họ.
xhienne

Câu trả lời:


11

-o password_stdindường như không hoạt động trên tất cả các hệ thống, ví dụ freeBSD. v.v ...

Bạn cũng có thể sử dụng expect Trình thông dịch, nó nên hoạt động với sshfs và nên thực hiện thủ thuật.

Một giải pháp khác là sshpass, ví dụ, giả sử bạn đang sao lưu thư mục / var / www

Sao lưu:

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

tải tập tin sao lưu lên máy chủ sao lưu

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

Vì vậy, nó sẽ tải lên thư mục với bản sao lưu ngày hôm nay

Nhưng vẫn như đã nói, cách tốt nhất (an toàn và đơn giản) sẽ là sử dụng cặp khóa ssh
Điều bất tiện duy nhất là bạn phải trải qua quá trình tạo khóa một lần trên mọi máy chủ bạn cần ghép nối, nhưng tốt hơn là giữ mật khẩu ở định dạng văn bản thuần túy trên tất cả các máy chủ bạn muốn sao lưu :),

Tạo một cặp khóa theo cách thích hợp

  • Trên máy chủ cục bộ

    ssh-keygen -t rsa
    
  • Trên máy chủ từ xa

    ssh root@remote_servers_ip "mkdir -p .ssh"
    
  • Tải các khóa công khai đã tạo lên máy chủ từ xa

    cat ~/.ssh/id_rsa.pub | ssh root@remote_servers_ip "cat >> ~/.ssh/authorized_keys"
    
  • Đặt quyền trên máy chủ từ xa

    ssh root@remote_servers_ip "chmod 700 ~/.ssh; chmod 640 ~/.ssh/authorized_keys"
    
  • Đăng nhập

    ssh root@remote_servers_ip
    
  • Kích hoạt giao thức SSH v2

    bỏ ghi chú "Giao thức 2" trong / etc / ssh / sshd_config

  • cho phép ủy quyền khóa công khai trong sshd

    uncomment "PubkeyAuthentication yes" trong / etc / ssh / sshd_config

  • Nếu StrictModes được đặt thành có trong / etc / ssh / sshd_config thì

    restorecon -Rv ~/.ssh
    

14

Theo hướng dẫn, có một tùy chọn -o password_stdin có thể cho phép đọc mật khẩu từ đầu vào tiêu chuẩn, có thể là chuyển hướng. Tôi chưa bao giờ sử dụng nó, vì vậy tôi đang suy đoán.

Điều đó nói rằng, tôi mạnh mẽ khuyên chống lại một giải pháp như vậy vốn không an toàn.

sshhoạt động rất tốt với một hệ thống khóa riêng / công khai. Nó là đơn giản và an toàn. Không cần nhập mật khẩu hoặc viết rõ ràng trong tập lệnh shell. Chỉ cần nhấn khóa công khai của bạn trên máy chủ và bạn có thể kết nối ngay lập tức.


Bất cứ ai cũng có thể cung cấp một ví dụ làm việc của giải pháp này? Tôi đang thử các cách sau, nhưng nó không hoạt động:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE

FYI, tôi nên đề cập đến việc tôi đang sử dụng khóa SSH được bảo vệ bằng mật khẩu. Tôi đã có thể để có được nó làm việc bằng cách sử dụng câu trả lời cung cấp bởi @ nathan-s-watson-Haigh tìm thấy ở đây: unix.stackexchange.com/questions/128974/...
MikeyE

Tôi không có bất kỳ môi trường phù hợp nào trong tay sẽ cho phép tôi kiểm tra giá trị gắn kết ssfs với khóa SSH được bảo vệ bằng mật khẩu. Dù sao, điều đầu tiên gây ấn tượng với tôi trong mệnh lệnh của bạn là tôi không thấy bất kỳ -o password_stdintùy chọn nào .
xhienne

Cảm ơn các đầu vào. Tôi đã thử lệnh sau đây và nó không yêu cầu mật khẩu, nhưng nó cũng không trả về. Có nghĩa là, nó chỉ ngồi đó chờ lệnh hoàn thành, không có dấu nhắc lệnh nào được hiển thị. Tôi đã thử lệnh: printf "my_password\n" | sshfs -o password_stdin user@hostname:/ $HOME/local_dir PS Tôi trên Debian Buster PPS Điều này hoạt động, nhưng nhắc nhập mật khẩu:sshfs -o password_stdin user@hostname:/ $HOME/local_dir
MikeyE

11

Đường ống "sshfs password"với <<<để -o password_stdinlàm việc trên bash:

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

4
Đây phải là câu trả lời được chấp nhận .. hoạt động trên mọi hệ điều hành Linux.
argon

vậy, làm thế nào để đặt nó vào tập tin mnt-media.mount để tự động gắn với systemd?
João José

Một nhận xét siêu nhỏ: nếu mật khẩu của bạn có các ký tự BASH đặc biệt trong đó (như tiếng nổ (!)), Thì bạn nên sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép cho mật khẩu.
Kyle Challis

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

Tùy chọn "-o password_stdin" là thứ cho phép bạn đặt mật khẩu của mình.

Điều đó nói rằng, khóa là một lựa chọn tốt hơn, trừ khi nhà cung cấp dịch vụ của bạn không cho phép bạn sử dụng chúng cho sftp. (Đây là một trong những thất bại đáng chú ý của WP Engine.)


Bạn có thể vui lòng làm rõ câu trả lời của bạn. Chỉ có một dòng mã không được tính vào SE là câu trả lời hay
Romeo Ninov

@RomeoNinov Tôi muốn nói rằng bài đăng này trả lời câu hỏi đủ tốt. Không phải ai cũng có xu hướng viết một cuốn tiểu thuyết giải thích tại sao điều hiển nhiên là rõ ràng.
Satō Katsura

@SatoKatsura Cảm ơn. Mặc dù vậy, tôi đang vượt qua thử thách.
iateadovy

2

Kịch bản gắn kết:

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

Bỏ qua:

#!/bin/bash

mount=$(pwd)/sshfs

fusermount -u $mount

1

Một điều cần lưu ý là nếu bạn đang sử dụng -o password_stdintùy chọn, nó có vẻ không hoạt động vì sshfs sẽ hỏi có nên kết nối với máy chủ hay không (nếu đó là lần đầu tiên bạn kết nối với nó và nó không được thêm vào vào tập tin máy chủ đã biết chưa). Nếu bạn đang chạy nó trong một đợt, bạn sẽ không bao giờ thấy sshfs hỏi. Cách giải quyết để tránh điều này là:

  1. thêm -o StrictHostKeyChecking=no tùy chọn vào sshfs hoặc
  2. chạy sshfs thủ công một lần để thêm máy chủ vào tệp máy chủ đã biết

0

Tập lệnh tự động để kết nối sftp với sshfs

#!/bin/bash
expect <<END
spawn sshfs sftpuser@ip:/folder /mnt/folder -p 22 -o password_stdin
send "password\r"
expect eof
END
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.