如何使用ssh将文件从一台机器复制到另一台机器

use*_*349 986 ssh file-copy

我正在使用 Linux (centos) 机器,我已经使用ssh. 现在我的问题是如何将文件从一个系统复制到另一个系统?

假设,在我的环境中,我有两个系统,如System ASystem B。我正在使用System A机器和其他一些使用System B机器。

如何将文件从 复制System BSystem A?并且,将文件从 复制System ASystem B?

Dop*_*oti 1376

句法:

scp <source> <destination>
Run Code Online (Sandbox Code Playgroud)

要复制文件B,以A在登录到B

scp /path/to/file username@a:/path/to/destination
Run Code Online (Sandbox Code Playgroud)

要复制文件B,以A在登录到A

scp username@b:/path/to/file /path/to/destination
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下,在使用 ssh 登录到远程服务器(系统 B)时,您通常不会使用 scp 将文件复制到本地计算机(系统 A)或从本地计算机(系统 A)复制文件。`scp` 会将您登录到远程服务器,复制文件,然后在一个进程中再次将您注销,因此只需从本地计算机上的 shell 运行它。话虽如此,如果您通过 SSH 登录到系统 B 并想在系统 B 和系统 C 之间复制文件,则可以使用 `scp`。 (151认同)
  • 记住 -r(递归)和 -p(保留系统元数据):scp -rp &lt;file1&gt; &lt;file2&gt; (17认同)
  • 是的,使用 `-P` 来指定远程主机上的 TCP 端口。这每次都会抓住我,因为 `ssh` 使用 `-p`。 (17认同)
  • 另外,要记住的重要一点是,您只能 scp 到目标计算机上您有权访问的文件夹。如果您尝试将其复制到目标用户没有权限的目的地,请先将文件复制到用户的主目录或子目录,然后 ssh 进入目标机器并 sudo 将其移动到最终目的地 (6认同)
  • @DopeGhoti。是的,您不能在两台远程计算机之间移动文件。源或目标必须是本地文件。但是,如果您使用 ssh 登录到远程机器,则可以使用该机器的命令行在两台远程机器之间复制文件。 (5认同)
  • 我在 Mac 上执行此操作,您不需要本地用户名。只是您要在本地复制的文件的路径以及您希望它远程转到的位置。示例:scp /home/myuser/sample.txt remoteuser@remoteserver.com:/home/remoteuser/ (2认同)
  • 准确地说:实际上,您登录的位置(在您的机器上!)并不重要,重要的是您用于运行命令(!)的当前 shell 的登录位置。 (2认同)

Rub*_*vvy 144

如果您需要替代方法。

安装 sshfs。如果您使用 ubuntu/debian:

sudo apt-get install sshfs
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用 centos/rhel:

sudo yum install fuse-sshfs
Run Code Online (Sandbox Code Playgroud)

或者,在 macOS 中

brew install sshfs
Run Code Online (Sandbox Code Playgroud)

创建一个空目录

mkdir /home/user/testdir
Run Code Online (Sandbox Code Playgroud)

“链接”或“挂载”两个目录

sshfs user@server.com:/remote/dir /home/user/testdir
Run Code Online (Sandbox Code Playgroud)

“取消链接”目录

fusermount -u /home/user/testdir
Run Code Online (Sandbox Code Playgroud)

在 BSD 和 macOS 上,卸载文件系统:

umount mountpoint
Run Code Online (Sandbox Code Playgroud)

或者

diskutil unmount mountpoint
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见linuxjournal.com libfuse/sshfs

  • +1 这个问题的答案可能与上下文无关,但它仍然对我有帮助,据我所知,其他人也有帮助。 (45认同)
  • 不相关,但这是一百万美元的答案 xD (12认同)
  • 该问题明确指出,所讨论的操作系统是 CentOS;不是 Debian 派生的。`apt-get` 是一种 Debian 主义;正确的包管理器应该是 `yum` 或者,对于真正旧的 CentOS,`up2date` 或 `rpm`。 (7认同)

Dan*_*ite 61

有时你需要对 tar 感兴趣:

tar -C / -cf - \
  opt/widget etc/widget etc/cron.d/widget etc/init.d/widget \
  --exclude=opt/widget/local.conf | 
  ssh otherhost tar -C / -xvf -
Run Code Online (Sandbox Code Playgroud)

  • 创造力?这就是我们过去共享磁带驱动器的方式。:) (18认同)
  • Tar 将 chdir 到“/”,因此以下所有路径都相对于“/”。 (5认同)
  • 你能告诉我们这是做什么的吗?例如,我不知道“cron”与复制文件有什么关系! (3认同)
  • @aliqandil opt/widget etc/widget etc/cron.d/widget etc/init.d/widget 是要包含在 tar 存档中的单个文件。关键是要说明为什么有时你需要花哨。这一系列命令通过 ssh 连接流式传输 tar 存档,并在另一端将其解压。因此没有 tar 存档被写入磁盘。我有时会使用它来挑选要在一个命令中复制的文件。 (3认同)

小智 31

如果您想让两个系统上的文件保持同步,请查看该rsync程序:

(请参阅此处的教程)


小智 10

使用以下代码通过安全 shell 递归复制文件和文件夹:

scp -r <host@machine_name:from_remote_directory_path> <to_local_directory_path>
Run Code Online (Sandbox Code Playgroud)

完整的示例可能如下所示:

scp -r sizwe@hprobook:./home/sizwe/PycharmProjects ./home/immaculate/OtherPycharmProjects
Run Code Online (Sandbox Code Playgroud)

请注意,如果您没有 DNS 服务器来解析主机名,请改用您的 IP 地址。上面的例子可能看起来像这样

scp -r 192.168.43.167:./home/sizwe/PycharmProjects ./home/immaculate/OtherPycharmProjects
Run Code Online (Sandbox Code Playgroud)


小智 9

如果他们在不同的端口上运行 SCP/SSH,请确保指定大写-P端口选项。

例子:

scp -P 7121 /users/admin/downloads/* root@155.138.150.12:/home/
Run Code Online (Sandbox Code Playgroud)

  • 这个问题已经七年了,已经有很多答案了。虽然 ssh 确实可以使用非默认端口,并且 ssh 客户端的 `-P` 选项是必需的,但您并没有真正帮助解决手头的问题。尝试专注于最近的问题。 (2认同)

Pe *_*Dro 7

通过 SSH 控制的 NVIDIA Jetson 计算机使用的一种更简单的方法是连接 SFTP(SSH 文件传输协议)。

假设我希望UFO_blueprint.odt从 NASA 的远程服务器移动文档并将其移动到我的文档中。

  1. cd 到您想要保存文件的位置

    $ cd Documents
    
    Run Code Online (Sandbox Code Playgroud)
  2. 连接

    $ sftp sammy@your_server_ip_or_remote_hostname
    
    Run Code Online (Sandbox Code Playgroud)
  3. 转到包含要传输的文件的目录。

    $ cd NASA/secret_files/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 转移

    $ get UFO_blueprint.odt
    
    Run Code Online (Sandbox Code Playgroud)

要获取完整目录,请改用

$ get -r secret_files/
Run Code Online (Sandbox Code Playgroud)

  • 使用`put`命令上传文件 (2认同)

Hop*_*nny 7

如果速度(而不是安全性)是您的首要任务,那么请查看 netcat。在开始之前,请允许我警告您,这只能在受信任的网络中使用,因为 netcat 传输未加密。

首先,在接收端运行以下命令:

nc -lp 22222 >FileName

然后在发送端:

nc -w3 <receiver IP or hostname> 22222 <FileName

笔记:

  • -l:监听模式
  • -p:要侦听的端口号(我选择了任意端口)
  • -w:连接超时


小智 6

ssh user@domain "printf 'dir' | pax -w " | pax -r

使用它代替 scp。Pax 由 IEEE 标准化 [1],而 scp 则被 lwn[2] 用户弃用。

[1] https://man.bsd.lv/pax.1#STANDARDS [2] https://lwn.net/Articles/835962/

来自“CLI 方式”上的其他人;-)