我正在使用以下命令创建一个小型备份脚本sshfs
:
sshfs backup_user@target_ip:/home /mnt/backup
有没有办法在此命令中包含密码?
或者除了 FTP/SFTP 之外,还有其他可以包含登录密码的文件传输解决方案吗?
答案1
发送'sshfs password'
与<<<
在 Bash 中工作-o password_stdin
:
sshfs -o password_stdin backup_user@target_ip:/home /mnt/backup <<< 'sshfs password'
请注意,密码用单引号引起来。谢谢凯尔!
答案2
-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 密钥对,
唯一的不便之处在于您必须在需要配对的每台服务器上都经历一次密钥生成过程,但这比在所有要备份的服务器上以纯文本格式保存密码要好 :),
以正确的方式生成密钥对
在本地服务器上
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
答案3
根据手册,有一个选项-o password_stdin
可能允许从标准输入读取密码,这可能是重定向。我从来没有用过它,所以我猜测。
也就是说,我强烈建议不要使用这种本质上不安全的解决方案。
ssh
与私钥/公钥系统配合得很好。它简单又安全。无需输入密码或将其明文写入 shell 脚本中。只需将您的公钥推送到服务器上即可立即连接。
答案4
需要记住的一件事是,如果您使用该-o password_stdin
选项,它可能看起来不起作用,因为 sshfs 会询问是否连接到主机(如果这是您第一次连接到它并且未添加)到已知的主机文件)。如果您批量运行它,您将永远不会看到 sshfs 询问。避免这种情况的解决方法是:
- 将选项添加
-o StrictHostKeyChecking=no
到 sshfs 或 - 手动运行一次 sshfs 将主机添加到已知的主机文件中