在这里,我曾经netns
使用VPN,但sshfs
无法正常工作。这是我尝试过的:
root@ubuntu:/mnt# ip netns exec secured sshfs -d -o sshfs_debug -p PORT USER@HOST: MOUNTPOINT
SSHFS version 2.8
FUSE library version: 2.9.7
nullpath_ok: 0
nopath: 0
utime_omit_ok: 0
executing <ssh> <-x> <-a> <-oClearAllForwardings=yes> <-oPort=PORT> <-2> <USER@HOST> <-s> <sftp>
Server version: 3
Extension: [email protected] <1>
Extension: [email protected] <2>
Extension: [email protected] <2>
Extension: [email protected] <1>
Extension: [email protected] <1>
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
INIT: 7.26
flags=0x001ffffb
max_readahead=0x00020000
INIT: 7.19
flags=0x00000011
max_readahead=0x00020000
max_write=0x00020000
max_background=0
congestion_threshold=0
unique: 1, success, outsize: 40
也就是说,ls
在挂载点上没有列出任何内容,即根本没有条目。sshfs
不打印任何内容上ls
,所以这看起来也很奇怪。可能是什么问题呢?
答案1
不幸的是,这是预期的行为。
http://man7.org/linux/man-pages/man8/ip-netns.8.html
ip netns exec 通过创建安装命名空间并将所有每个网络命名空间配置文件绑定安装到 /etc 中的传统位置,自动处理此配置、网络命名空间不感知应用程序的文件约定。
这意味着当您使用 时ip netns exec <namespace> <command>
,该命令不仅会在不同的网络命名空间中执行,还会在不同的挂载命名空间中执行。按照sshfs
您的要求成功安装,但您看不到该安装。
解决方法1
您只需打开网络命令提示符即可从那里开始工作:
ip netns exec secured bash
sshfs -d -o sshfs_debug -p PORT USER@HOST: MOUNTPOINT
# ... use MOUNTPOINT
解决方法2
创建共享后,您可以重新输入该挂载命名空间:
ip netns exec secured sshfs -d -o sshfs_debug -p PORT USER@HOST: MOUNTPOINT
ps -ef | grep sshfs
root 1880 1 0 13:15 ? 00:00:00 sshfs -p PORT USER@HOST:. MOUNTPOINT
# Now run a command (ls) in the same mount namespace
nsenter --mount -t 1880 ls
# You can of course run a command prompt there
nsenter --mount -t 1880 bash
解决方法3
请注意,这可能会更复杂,而且我还没有正确探索此选项。
根据上面的引用,挂载命名空间用于额外的网络配置。但理论上这不是必需的,因为您可以使用chroot
.
您可以尝试使用输入网络命名空间nsenter --net
并使用 achroot
设置所需的网络配置。然后,这将允许您sshfs
在主安装命名空间内执行。
答案2
正如提到的那样菲利普的回答,这是预期的行为,因为ip netns exec
在单独的安装命名空间中执行。诀窍是仅ssh
通过运行(进行网络通信)ip netns exec
,而不是整个sshfs
命令。
也就是说,不要这样做:
ip netns exec secured sshfs -p PORT USER@HOST: MOUNTPOINT
做这个:
sshfs -o ssh_command="ip netns exec secured ssh" -p PORT USER@HOST: MOUNTPOINT
答案3
我遇到过这个问题并四处询问。
事实上,ip netns
它似乎创造了一个临时安装命名空间并执行该命名空间中的任何挂载(nfs
、sshfs
等),一旦命令完成, MOUNT 命名空间就消失了,挂载点也消失了。
因此,通用解决方案是仅使用nsenter
命令在 NET 命名空间中执行挂载命令。
例如,如果您的挂载命令是:sshfs -p PORT USER@HOST: MOUNTPOINT
则执行:
nsenter --net=/run/netns/ns-secured sshfs -p PORT USER@HOST: MOUNTPOINT
并且挂载点将保留在全局(默认)命名空间中。它还适用于其他类型的远程网络 FS(例如 NFS)。