我一直在使用 sshfs 在我的笔记本电脑上挂载来自服务器的目录。
我的 ~/.ssh/config 中还有以下内容:ControlMaster auto
我设置这个是因为每当我 ssh 进入服务器时,它都会保持一个 ssh 连接处于活动状态。我这样做特别是为了使用 tramp 在 emacs 中快速浏览。
由于我的 /etc/fstab 中有 sshfs,因此来自 sshfs 的 ssh 连接是保持活动的。很多时候我还需要 X11 转发 (ssh -X -Y -C),而且由于我总是使用来自 sshfs 的原始连接,因此 X11 不会被转发。
当我从 fstab 中删除 sshfs 挂载并使用 -X -Y -C 选项手动 ssh 进入我的服务器时,X11 可以工作。
有没有办法为 sshfs 打开 -X -Y -C (或类似的)?我尝试添加 ForwardX11 yes ForwardX11Trusted yes
在 ~/.ssh/config 和 /etc/ssh/ssh_config 中强制始终启用该选项(可能有安全问题)。但是,/etc/fstab 中的 sshfs 不会选择此选项。
你有什么建议吗?谢谢!
答案1
解决这个问题的方法是使用脚本代替 ssh 命令。
sshfs 的手册页(至少自 2008 年 4 月 2.0 版起)
-o ssh_command=CMD
execute CMD instead of 'ssh'
像这样:
sshfs user@remote: mountpoint -o ssh_command='/path/to/sshcmd -Y -X -C '
这是 sshcmd
#!/bin/bash
# declare array for ssh options
declare -a CLEANED_SSH_OPTS
declare -a ADD_OPTIONS
# add options to be automatically added to the ssh command here.
# example
#ADD_OPTIONS=( '-C' )
# empty default
ADD_OPTIONS=( )
for OPT in "$@"; do
# add list of values to be removed
# from sshfs ssh options
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
# Start ssh with CLEANED options
exec ssh ${ADD_OPTIONS[@]} ${CLEANED_SSH_OPTS[@]}
# replace above exec with the next one if you ssh tunneling to run as your
# local user. Like when using automatic mounts from fstab.
# Please note that this has some extra security issues.
#exec su YourUserName -c "ssh ${ADD_OPTIONS[@]} ${CLEANED_SSH_OPTS[@]}"
在 fstab 中添加类似这样的内容应该可以自动挂载 sshfs 并启用转发。请注意,挂载时通常是 root 用户,因此您可能需要对 sshcmd 进行适当的更改(参见 sshcmd 的最后一行)。
sshfs#USERID@HOST:/TARGETPATH /MOUNT_POINT fuse _netdev,user,ssh_command=/path/to/sshcmd\040-Y\040-X 0 0
答案2
尝试这个:
sshfs -ossh_command="ssh -A me@host1_wan_ip ssh $@" me@host2_lan_ip:/ /media/me/mount1
答案3
昨天我遇到了完全相同的问题。我已修改,sshcmd
现在它还会尝试联系用户的ssh-agent
。谢谢 Manwë!
#!/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[*]}"