我通过 SSH 从本地 Ubuntu 机器连接到远程 Ubuntu 机器,并且想要将文件从远程 Ubuntu 复制/移动到本地 Ubuntu。
我需要这么做在 SSH 会话中(即从远程 Ubuntu 内部)。
这些不起作用:
scp [remote-source] [local-destination] # Which is actually:
scp /home/user/files_to_depart/file1.txt /home/user/files_that_arrived/file1.txt
否则怎么能做到这一点呢?
答案1
nullmeta 的回答完全有效,也许 nullmeta 会进行编辑以提供您正在寻找的说明。我发布了一个完全独立的解决方案,以解决由于网络结构(例如 NAT 防火墙)而难以简单地通过 ssh 返回本地系统的情况。
假设您有两台计算机,ComputerA 和 ComputerB。ComputerA 是您的本地工作站。ComputerB 是您可以通过 ssh 访问的远程计算机。
场景 1:如果 ComputerA不是NAT 防火墙后面
这是一个快速而简单的解决方案,结合了 scp 和 ssh(scp 使用 ssh 协议执行安全复制)。它要求您在两端(计算机 A 和计算机 B)安装 ssh 服务器(和客户端)。
要使用此解决方案,请从 ComputerB 运行:
scp /path/to/file/on/ComputerB ComputerAUser@ComputerA:/path/to/dump/file/on/ComputerA
场景 2:如果 ComputerA是NAT 防火墙后面
在这种情况下,您通常需要在 NAT 防火墙中配置端口转发。但是,您可能并不总是能够进行此类更改。在这种情况下,您可以配置从 ComputerA -> ComputerB 的 ssh 隧道,以便它也可以隧道反向连接。
建立 ComputerA -> ComputerB 的 ssh 连接时,请按以下方式使用 -R 选项。ssh ComputerBUser@ComputerB -R 2222:localhost:22
其中,ComputerBUser
是 ComputerB 上正在验证的帐户的用户名,2222
是 ComputerB 上的空闲端口。我们将使用此端口从 ComputerB 反向隧道传输回 ComputerA。
现在来自 ComputerB,您可以按照以下方式发出 scp 命令,从 ComputerB 复制文件到 ComputerA,其中ComputerAUser
ComputerA 上的用户名是:
scp -P 2222 /path/to/file/on/ComputerB ComputerAUser@localhost:/path/to/drop/file/on/computerA
这里发生了什么?看起来我们只是告诉 ComputerB 将文件发送回它自己,因为我们传递的是localhost
文件而不是 ComputerA。我们确实告诉 scp 将文件传递回 ComputerB,但传递到端口 2222。与 ComputerB 上端口 2222 的所有连接都会转发到 ComputerA 上的端口 22(默认 ssh 端口)。因此,通过在现有 ssh 连接上反向建立隧道,ComputerA 是否位于 NAT 防火墙后面并不重要。
场景 3:从 ComputerA 执行文件复制
或者,您不必尝试从 ComputerB 执行此操作,而是可以直接从 ComputerA 运行 scp 命令。
scp ComputerBUser@ComputerB:/path/to/file/on/ComputerB /path/to/dump/file/on/ComputerA
答案2
如果你需要一种简单的方法来浏览远程计算机的文件系统并将某些文件复制到本地计算机(反之亦然),你可以使用SSH文件系统。
描述
-
SSH文件系统(安全 Shell 文件系统)是 Linux(以及其他具有 FUSE 实现的操作系统)的文件系统,只需在远程计算机上使用安全 Shell 登录即可对远程计算机上的文件进行操作。在安装了 SSHFS 的本地计算机上,该实现利用了 FUSE(用户空间中的文件系统)内核模块。这样做的实际效果是,最终用户可以无缝地与通过 SSH 安全提供的远程文件进行交互,就像它们是他/她计算机上的本地文件一样。在远程计算机上使用 SSH 的 SFTP 子系统。
从
apt show sshfs
:sshfs
是基于 SSH 文件传输协议的文件系统客户端。由于大多数 SSH 服务器已经支持此协议,因此设置起来非常容易:即在服务器端无需执行任何操作。在客户端,安装文件系统就像使用 ssh 登录服务器一样简单。
安装
sudo apt install sshfs
与本指南不同我还没有在 Ubuntu 16.04 上做任何其他事情。没有fuse
用户组。
用法
创建合适的挂载目录,例如:
mkdir ~/sshfs-mount-point
安装远程路径:
安装远程路径,当你使用默认的 ssh 设置时:
sshfs user@IP:/remote/path ~/sshfs-mount-point
安装远程路径,当您使用自定义 ssh 设置时:
sshfs -o IdentityFile=/path/to/id_rsa,port=2222 user@hostname-or-IP:/remote/path ~/sshfs-mount-point
安装远程路径,当您正确配置了
~/.ssh/config
文件时:sshfs hostname:/remote/path ~/sshfs-mount-point
卸载远程路径。有两种方法:
fusermount -u ~/sshfs-mount-point
sudo umount ~/sshfs-mount-point
根据问题使用
答案3
如果不处于 SSH 会话中,您可能想要使用
scp user@remotehost:/file/to/copy /local/destination
如果你的本地机器正在运行 sshd 并且端口打开,那么在 ssh 会话中你可以
scp /remote/file user@localmachine:/destination/file
此链接有一些解决方法 https://unix.stackexchange.com/questions/2857/ssh-easily-copy-file-to-local-system
编辑:对于造成的任何混淆,我深感抱歉,最简单、最有效的方法是打开第二个终端并运行我提到的第一个 scp 命令。
答案4
要通过网络将文件从一台计算机移动到另一台计算机,您可以使用scp
实用程序(scp
代表安全复制)。ssh
仅用于远程登录访问。
由于您已经成功登录到网络上的另一台计算机,因此您可以简单地从那里将文件复制到本地计算机,但您需要ssh
在本地计算机上运行守护进程。因此,请先安装它:
$ sudo apt-get install openssh-server -y
确保它已启动并正在运行(绿灯亮表示它已启动并正在运行):
$ systemctl status sshd
将远程计算机上要复制到本地计算机的所有文件放在单独的目录中。然后,使用此命令:
$ scp -r [DIRECTORY] [USER]@[IP_ADDRESS]:~/Downloads
-r
表示将以递归方式处理目录及其所有内容。简而言之,这意味着每次要复制包含文件的目录时,您都要使用该选项。[DIRECTORY]
是该目录的路径。[USER]
是本地计算机上的用户。[IP_ADDRESS]
是该计算机的 IP 地址。后面的内容:
是您希望在本地计算机上保存文件的位置。在本例中,它是Downloads
文件夹。
实际情况如下: