命令行中使用sshfs的用户名和密码


15

我正在使用创建一个小的备份脚本sshfs

sshfs backup_user@target_ip:/home /mnt/backup

有没有办法在此命令中包含密码?

还是有其他文件传输解决方案可以包含FTP / SFTP以外的登录密码?


4
您可以使用ssh-gkeygen生成RSA密钥对,然后将ssh(客户端和服务器)配置为使用RSA身份验证。您之前是否已针对“常规” ssh验证完成此操作?
airhuff

是的,但后来我不得不改变服务器通过SSH连接方式..据我所知登录/密码不能同时在同一时间..认证可以基于密钥或
扎扎

2
他们可以都是。他们通常是。这样,新创建的用户可以通过输入密码将其密钥推入服务器。随后,他们使用其密钥。
xhienne

Answers:


11

-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
    
  • 启用S​​SH协议v2

    在/ etc / ssh / sshd_config中取消注释“协议2”

  • 在sshd中启用公钥授权

    在/ etc / ssh / sshd_config中取消注释“ PubkeyAuthentication yes”

  • 如果在/ etc / ssh / sshd_config中将StrictModes设置为yes,则

    restorecon -Rv ~/.ssh
    

14

根据手册,有一个选项-o password_stdin可能允许从标准输入中读取密码,这可能是重定向。我从未使用过它,所以在推测。

话虽如此,我强烈建议不要使用本质上不安全的解决方案。

ssh与私钥/公钥系统配合使用时效果很好。它既简单又安全。无需输入密码或在shell脚本中将密码写清楚。只需将公共密钥推到服务器上,即可立即连接。


任何人都可以提供此解决方案的有效示例吗?我正在尝试以下操作,但不起作用:printf "my_password\n" | sshfs username@hostname:/remote_fs $HOME/local_dir
MikeyE

仅供参考,我应该提到我正在使用受密码保护的SSH密钥。我能够使用@ nathan-s-watson-haigh提供的答案使它正常工作,该答案位于:unix.stackexchange.com/questions/128974/…–
MikeyE

我手头没有任何匹配的环境,让我可以使用受密码保护的SSH密钥测试ssfs挂载。无论如何,一开始我最想知道的是我看不到任何-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操作系统上均可使用。
氩气

那么,如何将其放在mnt-media.mount文件中以便通过systemd自动挂载?
若奥·何塞·

一条超级小注释:如果密码中包含特殊的BASH字符(例如bang(!)),则密码应使用单引号而不是双引号。
凯尔·查利斯

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

使用“ -o password_stdin”选项可以通过管道传递密码。

也就是说,密钥是一个更好的选择,除非您的服务提供商不允许您将其用于sftp。(这是WP Engine的显着故障之一。)


能否请您澄清一下答案。SE中只有一行代码不能算作是很好的答案
Romeo Ninov

@RomeoNinov我想说这篇文章确实很好地回答了这个问题。不是每个人都倾向于写小说来解释为什么显而易见的东西是显而易见的。
佐藤桂

@SatoKatsura谢谢。不过,我要迎接挑战。
iateadonut17年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.