我的情况:
- 我的局域网上有几台服务器我不管理
- 我使用 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 自动挂载”。