是否可以使用Unix命令通过SSH将子目录中的文件cp到远程计算机中?


17

~/Downloads在个人计算机的子目录中下载了一系列软件文件。我还使用bash使用来远程连接到计算机ssh

是否可以通过将此文件传输ssh到远程计算机?


该问题涉及单个文件(this file)和多个文件(a series of software files),最佳解决方案取决于您是单个文件还是多个文件。
user2768 2015年

Answers:


42

您可能要scp为此目的使用。这是使用SSH协议传输文件的安全方法。

例如,要将名为yourfile.txt从的文件复制~/Downloads到远程计算机,请使用:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

您可以在此处看到更多示例。


5
我觉得rsync可能工作为好,现在我想想
ShanZhengYang

1
rsync只是一个文件或
一堆

14
@Paebbels相反,将scp上面替换为rsync,它应该可以正常工作。
8bittree

我倾向于将rsync所有内容都使用,甚至是单个文件,因为在简单情况下它“可以正常工作”,而在其他情况下则效率更高。如果使用两种scprsync对任何尚未压缩和/或加密,记得要打开(压缩选项-C进行scp-z--compress进行rsync)。实际上,我是按习惯打开它的-很少见到这种情况会减慢速度(例如,如果您使用的是CPI功率有限的慢速低功率设备,例如rPi)。
David Spillett

37

虽然scp显然是正确的工具,但是如果由于某种原因而无法使用它,则可以从本地计算机执行以下操作,例如将目录结构复制到远程计算机:

tar -c . | ssh <remote> tar -x

这将tar在本地机器上当前目录,并写入的内容tarstdout其然后通过管道输送到一个ssh命令在那里将执行远程命令解压它从读取文件stdin

编辑以反映Dietrich Epp关于-f -在创建和提取端均是默认值的评论,因此无需明确指定。


7
如果要执行此操作,您可能需要添加一个-C basedir参数以tar提取主目录以外的其他位置。
Dougal 2015年

17

如果您想在少数情况下执行此操作,sshfs如果您使用的是支持FUSE的类Unix(Linux,* BSD,Mac OS X),则建议安装远程文件系统。在您的主目录下创建一个目录,例如〜/ remote-server:

    $ mkdir ~/remote-server

然后使用挂载远程文件系统sshfs。将“ yourserver.com”替换为远程计算机的主机名,并将“远程目录的名称”替换为您在远程系统上使用的目录。

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

完成此操作后,远程目录将成为文件系统的一部分,您可以在其上使用所有常规工具,包括cp

    $ cp ~/Downloads/your-files ~/remote-server

如果尚未sshfs安装,则应该可以使用软件包管理器将其安装在计算机上(查找名为sshfs或的软件包fuse-sshfs)。有关更多信息,您可以在线阅读教程

顺便说一下,这是我最喜欢的在远程服务器上管理文件的方式。我通常以这种方式安装一台生产服务器和两台开发服务器,并使用它们的常规文件浏览工作流程。


然后检查哪些sshfs选项将帮助您最好地完成工作。例如,从用户/组ID映射开始,如果带宽不足-o idmap={none,user,file},gid=<remote_user_group_ID>,allow_other,则-C进行压缩。一旦运行良好,我就亲自为命令添加别名,以通过ssh快速挂载远程文件系统。@Benjamin_Staton我不会在这里使用sudo或root,至少也没有正确的用户/组映射。
tuk0z

9

第一次,scp(复制过来ssh)和之间没有真正的区别rsync

后续运行将受益于rsync不复制已经存在的文件。

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a 对于所有文件
  • -v 冗长
  • -H 对于“只要找出符号链接并做正确的事”
  • 然后是源路径和目标路径。您可以在源代码中使用通配符,也可以仅同步整个目录。

其他有用的标志包括:

  • --delete 删除源中不再存在的目标中的文件。
  • --dry-run 用于测试-与结合使用时非常方便--delete

ssh如果已设置密钥,它也将使用密钥进行无密码登录。

运行结束时,rsync将告诉您与再次进行普通复制相比,速度快了多少倍。


1
-H实际上是针对硬链接的,当链接到源目录结构中的多个位置时,它会停止将相同内容发送两次或多次(但对于大型目录结构,该过程的效率会降低)。它对符号链接没有影响,但是-a/ 包含的某些选项--archive确实会影响符号链接的处理方式。
David Spillett

4

要添加到上面的答案。有时我不确定远程路径。在这些情况下,我通常sftp先导航到所需的位置,然后使用get或put来实际下载或上传文件。

如果您还希望始终保持同步,甚至想在本地执行远程计算机上的某个文件, sshfs效果很好。


-1

我在用ssh做非常相似的事情。我为Visual Studio创建了一个自定义生成工具,基本上是让VS运行ssh命令,该命令将我的代码复制到目标计算机,然后在该目标计算机上进行编译。

ssh userB @ hostB'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand'

注意使用单引号和分号。前者将您的命令通过ssh封装到hostB,后者允许您在hostA的一个ssh命令中运行多个hostB系统命令。

为了使此工作有效,您需要在启动计算机上设置ssh密钥,以便您可以是userA @ hostA并以userB身份登录到hostB。为userA @ hostA创建公共ssh密钥的过程已被详细记录。如果您没有在hostA上为userA创建公用密钥,而是将该密钥作为userB复制到hostB,那么每次都将被迫输入密码-这破坏了自动化的乐趣。


投票否决的人能否发表评论,说明为什么投票?没有信息反馈,否决票毫无意义。我已经用直接相关的答案回答了OP的特定问题。我不是在介绍新技术或在建议替代路线。为什么?也许OP不想使用替代路线。
安德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.