我有一台运行 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 su
或sudo
。 - 您的系统可能使用与 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
,然后脚本将等待响应,直到达到超时。
现在你只需要在挂载点执行cron
或systemd
在挂载点执行即可。
使用计划任务,像这样的简单输入就可以起作用:
@reboot /root/mount_sshfs.sh
使用 systemd:
您必须创建脚本。参见上文。
您必须创建一个新的 Systemd 服务脚本。
例如:/etc/systemd/system/mount_network.sh
文件内容:
[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.com
2222
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
。