我正在使用创建一个小的备份脚本sshfs
:
sshfs backup_user@target_ip:/home /mnt/backup
有没有办法在此命令中包含密码?
还是有其他文件传输解决方案可以包含FTP / SFTP以外的登录密码?
我正在使用创建一个小的备份脚本sshfs
:
sshfs backup_user@target_ip:/home /mnt/backup
有没有办法在此命令中包含密码?
还是有其他文件传输解决方案可以包含FTP / SFTP以外的登录密码?
Answers:
-o password_stdin
似乎并非在所有系统上都可以运行,例如freeBSD。等等。
您还可以使用expect
Interpreter,它应该与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密钥对
。唯一的不便之处是,您必须在每台服务器上完成一次密钥生成过程您需要进行配对,但比在要备份的所有服务器上以纯文本格式保存密码要好:),
以正确的方式生成密钥对
在本地服务器上
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协议v2
在/ etc / ssh / sshd_config中取消注释“协议2”
在sshd中启用公钥授权
在/ etc / ssh / sshd_config中取消注释“ PubkeyAuthentication yes”
如果在/ etc / ssh / sshd_config中将StrictModes设置为yes,则
restorecon -Rv ~/.ssh
根据手册,有一个选项-o password_stdin
可能允许从标准输入中读取密码,这可能是重定向。我从未使用过它,所以在推测。
话虽如此,我强烈建议不要使用本质上不安全的解决方案。
ssh
与私钥/公钥系统配合使用时效果很好。它既简单又安全。无需输入密码或在shell脚本中将密码写清楚。只需将公共密钥推到服务器上,即可立即连接。
printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
-o password_stdin
选择。
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
echo 'password' | sshfs user@host:/dir /mnt -o password_stdin
使用“ -o password_stdin”选项可以通过管道传递密码。
也就是说,密钥是一个更好的选择,除非您的服务提供商不允许您将其用于sftp。(这是WP Engine的显着故障之一。)
挂载脚本:
#!/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