通过 autofs 以用户身份运行 sshfs

通过 autofs 以用户身份运行 sshfs

我的情况:

  • 我的局域网上有几台服务器我不管理
  • 我使用 SSH 访问它们SSHFS、shell 和远程 X11 应用程序
  • 我已经ControlMaster auto~/.ssh/config文件中进行了设置,因此不会遇到身份验证滞后
  • 我使用压缩和快速/弱密码,因为我要么在私人局域网上,要么使用 VPN
  • 只要有可能,我就会将我的(无密码)公共 RSA 密钥导出到服务器

我已经开始使用自动文件系统让我的生活更轻松,但是自动文件系统希望以 root 身份运行其所有挂载命令。当然,我可以以 root 身份生成新的 RSA 密钥对并导出,并将我自己的~/.ssh/config选项复制到超级用户的配置文件中,但我宁愿不保留这些东西的两个副本,而且它也不能解决我希望每个主机只有一个打开的 SSH 连接的愿望。因此,我希望有自动文件系统sshfs以非特权用户身份运行,就像在终端手动调用时一样。

我已经调查过自动文件系统脚本,但这些似乎不能解决我的问题。有什么建议吗?

答案1

JFTR,我已经修改(并简化),ssh_user以便它首先尝试联系用户的ssh-agent

#!/bin/bash
# Open a ssh connection as a given user, thus using his/hers authentication
# agent and/or config files.
: ${ADDOPTS:="-2Ax"}
: ${LOCAL:="kreator"}
export SSH_AUTH_SOCK=$(find /tmp/ssh-* -type s -user ${LOCAL} -name agent* | tail -1)
declare -a options=( $* )

# Remove unwanted options
for (( i=0,fin=${#options[*]} ; i < fin ; i++ ))
do
    case ${options[$i]} in
            (-a|-oClearAllForwardings=*)    unset options[$i]
                                            ;;
    esac
done

exec /bin/su ${LOCAL} -c "$(which ssh) ${ADDOPTS} ${options[*]}"

答案2

直接取自afuse 主页(重点是我的):

afuse 是一个使用 FUSE 在用户空间实现的自动挂载文件系统。afuse 目前实现了自动挂载程序所能预期的最基本功能;即它管理虚拟目录的目录。如果访问了其中一个虚拟目录但尚未自动挂载,afuse 将尝试将文件系统挂载到该目录。如果挂载成功,则请求的访问将正常进行,否则将失败并出现错误。请参阅下面的示例以了解具体的使用场景。

与传统自动挂载程序相比,使用 afuse 的优势在于 afuse 完全由个人用户在用户空间中运行。因此它可以利用调用用户的环境,例如允许访问 ssh-agent 以进行无密码 sshfs 挂载,或允许访问图形环境以获取用户输入来完成挂载,例如询问密码。

这个选择似乎是稳操胜券的。

答案3

大量借鉴另一个类似的问题,我找到了一个解决方案。不过,这需要进行一些认真的试验和调整。请注意,这个修改后的脚本现在与从 挂载不兼容/etc/fstab

/etc/auto.master

/- /etc/auto.sshfs uid=1000,gid=1000,--timeout=30,--ghost


/etc/auto.sshfs

/local/mountpoint -fstype=fuse,rw,nodev,nonempty,noatime,allow_other,workaround=rename,ssh_command=/usr/local/sbin/ssh_user :sshfs\#remoteuser@server\:/remote/path


当然,这需要可执行:/usr/local/sbin/ssh_user

#!/bin/bash

# declare arrays for ssh options
declare -a ADD_OPTIONS
declare -a CLEANED_SSH_OPTS

# add options to be automatically added to the ssh command here.
# example
#ADD_OPTIONS=( '-C' )
# empty default
ADD_OPTIONS=(  )
# The following options to SSH cause it to open a connection and immediately
# become a background task. This allow this script to open a local socket
# for future invocations of ssh. (use "ControlMaster auto" in ~/.ssh/config)
SOCKET_OPTIONS=( '-fN' )

for OPT in "$@"; do 
  # Add list of values to be removed from sshfs ssh options. By default, sshfs
  # disables X11 forwarding. We're overriding that behavior.
  case $OPT in
    "-x")
     # this and these like this will be removed
    ;;
    "-a")
    ;;
    "-oClearAllForwardings=yes")
    ;;
    *)
      # These are ok.. add
      NUM=${#CLEANED_SSH_OPTS[@]}
      CLEANED_SSH_OPTS[$NUM]="$OPT"
    ;;
  esac
done

# For some reason, I needed to generate strings of the ssh command before
# passing it on as an argument to the 'su' command. It simply would not
# work otherwise.
# Throwing the $SOCKET_OPTIONS in with the rest of the arguments is kind
# of hackish, but it seems to handily override any other specified behavior.

# Establishes an ssh socket if none exists...
SSH_SOCKET_CMD="ssh $SOCKET_OPTIONS ${ADD_OPTIONS[@]} ${CLEANED_SSH_OPTS[@]}"
su localuser -c "$SSH_SOCKET_CMD"

# ...and use that socket to mount the remote host
SSH_SSHFS_CMD="ssh ${ADD_OPTIONS[@]} ${CLEANED_SSH_OPTS[@]}"
exec su localuser -c "$SSH_SSHFS_CMD"


如果有人关心的话:~/.ssh/config

Host *
ControlMaster auto
ControlPath /tmp/%u@%l→%r@%h:%p
ServerAliveInterval 10
Compression yes

Host host1 host1.myschool.edu host2 host2.myschool.edu
ForwardX11 yes
Ciphers arcfour256,arcfour128,arcfour,blowfish-cbc

Host host3 host3.myschool.edu
ForwardX11 no
Ciphers arcfour256,arcfour128,arcfour,blowfish-cbc

答案4

自动sshfs可能接近您所追求的:它是“使用用户的 SSH 配置和密钥的每个用户 SSHFS 自动挂载”。

相关内容