ssh
。这是一个很棒的工具,但是一个细节对我而言似乎总是很奇怪。尽管ssh连接允许使用scp
和传输文件sftp
,但是如果不在本地主机上运行程序或从远程连接到本地计算机,我们就无法在本地和远程系统之间移动文件。
后者是一个实际问题,因为服务器通常在防火墙后面或NAT路由器后面连接,即没有永久IP地址。结果,无论如何,服务器将无法连接到先前从中访问过的本地系统。如果在ssh会话中,您可以仅获取本地文件或远程文件,然后将其传输到需要的位置,则非常方便。
实际上,我还没有完全实现这个目标,但是我离实现它非常接近。在本文中,我将向您介绍一个脚本,该脚本允许您在本地计算机上安装远程目录。在本地计算机上,您需要安装
sshfs
,但是在您可能无法安装程序的远程位置,您无需进行任何更改。如果您花一些时间来设置系统,并且客户端计算机上有可用的ssh服务器,则还可以在远程系统上安装本地目录。您不必担心阻止IP地址或端口。实际上,如果您能够连接到远程计算机,则意味着您将成功实现我想告诉您的内容。
结果,如果将所有这些结合起来,事实证明我非常接近目标。我可以在客户端或服务器上使用命令外壳,并且能够方便地在连接的两侧读取和写入文件。为此,您只需要正确配置所有内容即可。
这里有一个陷阱吗?
也许您认为存在某种陷阱。毕竟,我们实际上是在谈论使用两个ssh连接。一个用于挂载文件系统,另一个用于登录计算机。事实确实如此。但是,如果配置正确
ssh
,则身份验证仅需要执行一次,而无需花费太多时间来组织两个连接。
另外,我将要讨论的脚本大大简化了工作。它向用户隐藏了详细信息,因此连接过程(几乎)照常进行,然后一切正常。
关于sshfs的几句话
该实用程序
sshfs
允许您使用用户空间中的文件系统(用户空间中的文件系统,FUSE)。也就是说,我们正在谈论一个事实,即用户空间中的一层位于基础文件系统之上。在这种情况下,这样的文件系统就是支持的ssh服务器sftp
。这样,您就可以使用远程系统上的文件,将它们视为本地计算机上的真实文件系统中的文件。如果您还没有尝试过sshfs
,请尝试一下。该实用程序效果很好。
假设您已登录计算机
myserver
并从本地计算机运行以下命令:
sshfs myserver:/home/admin ~/mounts/myserver
这将使远程计算机目录
/home/admin
可沿路径在本地系统上访问~/mounts/myserver
。
使用时,
sshfs
可以使用各种选项。例如,您可以安排在失去连接后重新连接。有关详细信息,sshfs
请参见“帮助”。
由于它
sshfs
使用文件的远程安装版本,因此对该文件所做的所有更改都保存在远程计算机上。并且在关闭sshfs连接之后,本地计算机上没有任何内容。我们现在将解决此问题。
初步准备
在继续上述脚本的描述之前,我想谈谈一些客户端设置,您可以根据需要自行修改。因此,在这里我创建一个目录
~/remote
,并在其中为每台远程计算机创建子目录。例如,它可以是目录~/remote/fileserver
和~/remote/lab
。
该脚本称为
sshmount
。它采用与相同的参数ssh
。为了简化脚本的工作,有关远程主机的信息应存储在一个文件中~/.ssh/config
,该文件将允许使用简单和简短的主机名。例如,计算机信息lab
可能如下所示:
Host lab
Hostname lab.wd5gnr-dyn.net
Port 444
User alw
ForwardX11 yes
ForwardX11Trusted yes
TCPKeepAlive yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
确实不是必需的,但是通过这种方法,您可以使用一个漂亮的目录
~/remote/lab
,而不是一个复杂的视图构造~/remote/alw@lab.wd5gnr-dyn.net:444
。所有这些参数都没有什么神秘之处。我唯一想引起您注意的是,ControlMaster
并ControlPath
允许您组织起来以使其在这种情况下非常重要的化合物更快地运行。
此外,您可以使用ssh私钥组织到远程系统的自动连接。这是关于它的东西。
脚本
我们的脚本可以两种方式使用。因此,如果通过链接进行调用
sshunmount
,它将卸载与指定远程主机关联的文件系统。如果以不同的方式调用(通常是如何调用sshmount
),则它将执行以下三个操作:
- 它检查目录是否包含
~/remote
与主机名同名的子目录(例如-lab
)。如果没有这样的目录,它将显示错误消息并继续工作。 - 如果存在这样的目录,则在所需的文件系统已经安装的情况下,脚本会查看已安装的文件系统的列表。如果是这样,他将继续工作。
- 如果未安装目录,它将调用
sshfs
并继续。
该脚本可以在GitHub上找到。这是其代码,从中删除了一些注释:
#!/bin/bash
if [ "$1" == "" ]
then
echo Usage: sshmount host [ssh_options] - Mount remote home folder on ~/remote/host and log in
echo or: sshunmount host - Remove mount from ~/remote/host
exit 1
fi
# sshunmount...
if [ $(basename "$0") == sshunmount ]
then
echo Unmounting... 1>&2
fusermount -u "$HOME/remote/$1"
exit $?
fi
# ...
if [ -d "$HOME/remote/$1" ] # ?
then
if mount | grep "$HOME/remote/$1 " # ?
then
echo Already mounted 1>&2
else
sshfs -o reconnect $1: $HOME/remote/$1 # mount
fi
else
echo No remote directory ~/remote/$1 exists 1>&2
fi
ssh $@ #
该脚本给了我所需的一半。即,它使您可以方便地使用我连接到的本地计算机上的远程文件。但是要使它能够从远程计算机上处理位于本地计算机上的文件变得更加困难。
解决反问题
如果要在服务器上的本地计算机上尝试安装文件夹,则需要在本地计算机上运行ssh服务器。当然,如果您的本地计算机对服务器可见并且可以访问,那么这很简单:只需在远程计算机上运行它,然后
sshfs
从本地计算机上将文件夹安装在该计算机上即可。但是在许多情况下,我们无法访问本地系统,该本地系统可能位于防火墙或路由器之后。如果本地系统的角色是由可以从不同位置连接到网络的笔记本电脑担当,则尤其如此。
但是尽管有这些困难,我们的任务仍然可以解决。解决方案分为两部分。
首先-有必要在致电时
sshmount
,请指定其他参数(如果您需要不断执行这样的命令,则可以编辑该文件):
sshmount MyServer -R 5555:localhost:22
其次,连接主机后,需要运行以下命令:
sshfs -p 5555 localhost:/home/me ~/local
多亏了该选项
-R
,在远程计算机上创建了端口上的套接字(该套接字5555
当然应该是免费的),并且它与22
本地计算机的端口进行了连接。假设ssh服务器在port上运行22
,这将允许该服务器通过同一连接连接到本地计算机。它不需要知道我们的IP地址或开放端口。可以在系统启动时执行
的命令
sshfs
将本地目录链接/home/me
到~/local
远程服务器上的目录。此外,如果您是本地登录的,则可以查看以开头的环境变量,SSH_
并了解有关SSH连接的更多信息。例如,这些是变量$SSH_CLIENT
和$SSH_TTY
。
当然,为了使上述命令对您有用,您需要将主机名和目录以及端口地址更改为系统上使用的主机名和目录。但是,在完成所有配置之后,您所需的所有文件将在本地和远程计算机上均可用。顺便说一句,我没有尝试组织目录的循环安装。如果尝试这样做,可能会发现一些非常奇怪的事情。
结果
我想您在同时安装本地计算机上的远程文件夹和远程计算机上的本地文件夹时需要小心。例如,扫描整个文件系统的实用程序在这种配置中可能会感到困惑。另外,我仍在寻找有关退出最后一个会话时如何与服务器文件系统正确断开连接的问题的答案。
但是,即使到现在,所有这些都为我们提供了用于组织使用软件文件进行方便且可靠的工作的良好工具
ssh
。应该注意的是,解决远程系统上的文件问题的另一种选择是同步文件夹并使用它们在计算机之间传输文件。
您如何使用远程Linux系统上的文件?