通过 fstab 自动挂载 sshfs 卷并进行密码验证

通过 fstab 自动挂载 sshfs 卷并进行密码验证

我有一台运行 Ubuntu 12.04.4 的无头服务器,需要在重启后无需用户干预即可恢复。目前有一个手动过程,涉及通过 sftp 查看远程服务器上的文件并操作某些文件。sftp 站点的身份验证使用用户名和密码。我想通过直接在需要文件的服务器上安装远程卷来消除进入 sftp 服务器的手动步骤,从而自动执行此过程。

请注意,我没有 ssh 身份文件,因为没有使用基于密钥的身份验证。我无法将远程端更改为使用密钥身份验证;我需要使用现有的用户名和密码。我发现的大多数指南仅涉及使用基于密钥的身份文件。

当前 fstab 配置:

sshfs#[email protected]:/SecureFTP /my/localpath fuse allow_other,uid=root,gid=clientfiles,umask=0770

交互安装时,它会提示输入密码。我需要服务器能够在重启后恢复,而无需有人照看和输入密码,因此它需要在没有任何提示的情况下工作。除了提示之外,我不知道如何输入密码。理想情况下,我可以像使用选项一样指定带有用户名和密码的凭据文件credentials=<file name> cifs

我已经尝试credentials=password=作为挂载选项但它们似乎没有被定义sshfs;我明白了fuse: unknown option

sshfs确实有一个password_stdin选项,但我不确定它在 fstab 中如何应用。

答案1

  • 在此示例中,我暗示我们以 root 身份工作。如果不是,请在需要时应用sudo susudo
  • 您的系统可能使用与 Systemd 不同的初始化系统,但 Cron 非常通用。

您可以简单地使用/etc/fstab它来预定义您的挂载选项等等。

例子:

USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY /LOCAL/MOUNTPOINT fuse.sshfs  defaults,password_stdin,_netdev 0 0

请记住,默认安装选项远非完美。
例如:重新连接很重要。请参阅:https://github.com/libfuse/sshfs/issues/101

具有这些选项的示例(取自 Github 问题):

sshfs#[email protected]:/content/ /mnt/srv fuse   password_stdin,defaults,user,allow_other,reconnect,delay_connect,ConnectTimeout=5,ServerAliveInterval=5,IdentityFile=/root/.ssh/id_rsa_storage 0 0

完成后,您需要一个包含唯一内容的简单脚本,例如:

#!/bin/bash
echo "passwordgoeshere" | mount /mnt/srv

让我们将其保存在您的根用户下,例如:/root/mount_sshfs.sh
现在您需要使其可执行:chmod +x /root/mount_sshfs.sh

Timeout waiting for prompt错误:您应该尝试运行该脚本一次,看看它是否有效。如果它不退出并且最终出现错误Timeout waiting for prompt,请尝试 ssh 进入远程主机以 root 身份。如果您以前从未这样做过,sshfs 将提示将主机添加到文件中known_hosts,然后脚本将等待响应,直到达到超时。

现在你只需要在挂载点执行cronsystemd在挂载点执行即可。
使用计划任务,像这样的简单输入就可以起作用:
@reboot /root/mount_sshfs.sh

使用 systemd:

  1. 您必须创建脚本。参见上文。

  2. 您必须创建一个新的 Systemd 服务脚本。
    例如:/etc/systemd/system/mount_network.sh

  3. 文件内容:

    [Unit]
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    ExecStart=/root/mount_sshfs.sh
    
    [Install]
    WantedBy=default.target
    

笔记:

  • 我没有测试 systemd 方法,因为我尽量不依赖它。这是个人喜好。
  • 使用 cron 时,您可能需要在脚本中添加“睡眠”,这样它就不会“过早”尝试运行脚本,即在互联网/网络启动之前。

来源:https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux

答案2

是的,您可以使用 sshpass 在 fstab 中执行此操作。

该参数看起来像这样,并且sshpass -f /root/sftp.pass ssh在连接时简单执行:ssh_command=sshpass\040-f\040/root/sftp.pass\040ssh

例如,要username使用密码连接到端口上的secret服务器,您的 fstab 条目可能如下所示:sftp.example.com2222

sshfs#[email protected]:/ /mnt/sftp fuse ssh_command=sshpass\040-f\040/root/sftp.pass\040ssh,_netdev,rw,port=2222,allow_other,reconnect,user,sshfs_debug,kernel_cache,auto_cache,uid=0,gid=0 0 0

您将需要一个/root/sftp.pass包含密码的文件:

secret

理想情况下,您应该创建一个 systemd 单元来确保此挂载重新连接,有关具体信息,请参阅其他答案,但您可以每隔一两分钟运行一次这样的脚本:

/bin/mountpoint -q /mnt/pwprodshare || /bin/mount /mnt/pwprodshare >> /dev/null

答案3

以下是如何做到这一点的假设

  • 只有一个本地用户(USER,uid 1000)需要访问远程安装
  • 您的 ssh 密钥已通过您的登录密钥环解锁
  • 你想要一个 systemd 自动挂载
$ cat /etc/ssh/ssh_config.d/agent.conf
Host REMOTE
    IdentityAgent /run/user/1000/keyring/ssh

fstab 行:

USER@REMOTE:/remote/path /mount/point fuse.sshfs x-systemd.automount,user,idmap=user,transform_symlinks,identityfile=/home/USER/.ssh/id_rsa,allow_other,default_permissions,uid=1000,gid=100 0 0

请记住先使用相应的选项手动挂载(和卸载)一次sudo sshfs

相关内容