![如何从已通过 ssh 进入的服务器上下载文件?](https://linux22.com/image/501117/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%B7%B2%E9%80%9A%E8%BF%87%20ssh%20%E8%BF%9B%E5%85%A5%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我知道如何使用 scp 或 wget 将远程服务器上的文件下载到本地计算机。但是,如果我已经使用 ssh 登录到服务器,是否有命令可以让我将服务器上的密码中的文件下载到本地计算机?
我想我可以使用 scp,但我的本地机器通常位于路由器后面。我是否必须在路由器上打开一个端口?
答案1
您需要回答的是为什么您不想再次登录......如果您登录过一次,您可以登录两次......特别是如果您花了三分钟来创建密钥并远程存储密钥:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
2b:4c:11:ab:53:d1:15:90:4f:88:a1:42:da:c5:1c:98 user@localhost
$ ssh-copy-id user@remotehost
Warning: Permanently added 'remotehost' (RSA) to the list of known hosts.
Password:
$ ssh user@remotehost
Last login: Mon Dec 14 21:52:45 2009 from 1.2.3.4
[user@remotehost] $
在 TCP/IP 尚未普及的时代,人们使用 X/Modem 等临时工具来处理这个问题。现在使用这种方法有点愚蠢。
答案2
它有点过时了,但你也许可以使用像 kermit 这样的程序来使用调制解调器时代的协议(zmodem 等)。看起来有一个程序也只是为了这个目的。
我曾经需要从远程 unix 服务器下载一个小文件,但没有任何支持工具,所以我对文件进行了 uuencoded 处理,使用 cat 将其转储到终端,然后使用本地终端程序捕获生成的文本,并对其进行 uudecoded 处理。很恶心,是吧?:)
答案3
SCP 是完成这项工作的正确工具。只需从本地计算机启动 scp,即可使用:
scp 用户@远程主机:/路径/到/文件/文件名 ~/
...这会将文件放在您的主目录中的本地盒子上。
答案4
我想到了一个使用标准 ssh 客户端来执行此操作的方法。这是一个脚本,它会复制当前的 ssh 连接,在远程计算机上找到您的工作目录,然后将您指定的文件复制回本地计算机。它需要 2 个非常小的脚本(1 个远程脚本,1 个本地脚本)和 ssh 配置中的 2 行。步骤如下:
1)将这两行添加到您的~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p
现在,如果您已打开与 machineX 的 ssh 连接,则无需密码即可打开另一个。
2)在远程机器上创建一个名为 ~/.grabCat.sh 的一行脚本
#!/bin/bash
cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
3)在本地机器上创建一个名为~/.grab.sh的脚本
#!/bin/bash
[ -n "$3" ] && dir="$3" || dir="."
ssh "$1" ".grabCat.sh $2" > "$dir/$2"
4)在(~/.bashrc 或其他任何地方)为 grab.sh 创建一个别名 alias grab=~/.grab.sh
就这样,全部完成了。从现在起,如果您登录到“machineX:/some/directory”,只需启动一个新终端并输入
grab machineX filename
这会将文件放入本地计算机上的当前工作目录中。您可以将其他位置指定为“grab”的第三个参数。
注意:显然两个脚本都必须是“可执行的”,即 chmod u+x filename