在Linux中向Windows进行scp传输

134

我正在Windows机器上运行putty客户端,成功连接到Linux终端。现在,我想将位于Linux路径/home/ubuntu/myfile下的文件复制到本地计算机的C:/Users/Anshul/Desktop下。Windows机器的用户是anshul。我在putty上输入以下命令,但并没有起作用:

scp /home/ubuntu/myfile ip_address_of_windows_machine:C:/Users/Anshul/Desktop 

我认为Windows机器的路径是错误的。请帮帮我,因为我在许多论坛上搜索了很久,但似乎没有正确的Windows服务器路径。请不要建议像WinScp这样的替代选项。


4
你在Windows上运行什么样的ssh“服务”?正确答案取决于你对这个问题的回答。 - Ernest Friedman-Hill
6
在寻求帮助时,“不起作用”这个词组是最没有用的。具体是哪个方面出现问题?你实际上得到了什么结果?是否有任何错误信息?如果有,请将其包含在你的帖子中。 - Jeremy J Starcher
尝试使用“ssh -v ip_address_of_windows_machine dir”命令。如果无法通过ssh连接到该计算机,则也无法使用scp进行连接。使用“-v”选项可以提供一些有关连接方式的反馈,并帮助确定是IP地址、Windows计算机上的sshd服务器等问题。 - Dave X
2
hello.txt文件复制到WINDOWS_MACHINE_IP上的管理员账户下的hello.txt文件。这将把文件复制到C:\Users\Administrator\hello.txt - leodotcloud
@emoblazz如果您不想安装第三方工具,则提供了最佳答案。基本上,您需要确保在用户名前加上@。 - ThinkBonobo
16个回答

143

这一个对我起了作用。

scp /home/ubuntu/myfile username@IP_of_windows_machine:/C:/Users/Anshul/Desktop 

40
这是这个问题唯一正确的答案。 - Mithridates the Great
6
在我的情况下,该命令可以工作但不完全。会显示以下消息:ssh: connect to host <ip_address> port 22: Connection refused。 - Alex Javarotti
1
@AlexJavarotti,你遇到的错误可能是由防火墙设置引起的。 - willisc
我意识到这个问题不是关于MacOS的,但在Mac上,我发现这个答案中建议的形式和一个省略了初始“/”的变体都可以工作。所以类似于...:C:/Users/...等等。并没有太大的区别,但值得注意。 - cycollins
@ChouW “连接被拒绝”并不是防火墙问题。这只是因为服务未启动,因此未绑定到22号端口。 - Déjà vu
@Breakingnotsobad 无法回忆起是2年前的事了。我认为可能是Windows操作系统中的防火墙阻止了请求,导致我们收到了“连接被拒绝”的错误提示。 - willisc

95

Putty下载页面下载pscp,然后在Windows命令行中使用以下命令:

pscp username_linux_machine@ip_of_linux_machine:/home/ubuntu/myfile.ext C:\Users\Name\Downloads

输入Linux机器的密码后,复制过程将开始。


直到我添加了-scp标志,这个命令对我才起作用。 - Steven
Windows 10自带的scp在完成大文件传输时存在问题(出现奇怪的错误“<filename>:是一个目录”,导致部分文件无法下载,尽管下载已经完成)。而pscp似乎运行良好! - Bigue Nique
4
我很喜欢某件事情第一次就能成功。谢谢。 - Mark Longmire
请注意,如果您使用由 ssh-keygen 生成的 ssh 密钥,则需要使用 PuTTYgen 将其转换为 PuTTY 特定的格式。 - MegaCasper

70

试试这个,它真的很有效。

$ scp username@from_host_ip:/home/ubuntu/myfile /cygdrive/c/Users/Anshul/Desktop

复制所有文件的方法如下

$ scp -r username@from_host_ip:/home/ubuntu/ *. * /cygdrive/c/Users/Anshul/Desktop

7
注意路径中的"/cygdrive/c"吗?在安装CYGWIN后,这将起作用。这仍然是一个很好的建议! - Salvador Valencia
2
在Windows上,您也可以选择使用pscp(PuTTY软件包的一部分,或者可以单独下载) http://www.putty.org/ - The-Duck
@SalvadorValencia ubuntu@ip-172-31-22-20:~$ scp try.sh Administrator@XXXX:/cygdrive/c/Users/Administrator/Desktop ssh: 连接到主机 XXXX 端口 22 失败:连接被拒绝 连接丢失 - Ashish Karpe
1
我正在Linux服务器上,想要复制到Windows服务器!另外,Cygwin会监听22号端口吗?否则,由于我的Windows服务器在AWS EC2实例中,我们应该打开哪个端口? - Ashish Karpe
2
@AshishKarpe 这看起来像是命令已经运行,但遇到了路由器/防火墙问题。请执行“telnet XXXX 22”并查看是否打开了端口。如果没有,则可以通过iptables或Windows防火墙等方式解决,StackOverflow应该能帮助你解决这个问题。 - Salvador Valencia
显示剩余3条评论

51

通过 Git Bash 控制台在 Windows 上访问(CMD 和 PowerShell 也适用):

scp user@ip:/dir1/dir2/file "D:\dir1\dir2"

7
终于有些行之有效的建议了,谢谢! - MSC
不错!这个很有效并且非常简单。 - Zack A
路径不应该用引号括起来,除此之外答案是正确的。谢谢。 - Tanmey Rawal
为了使用域帐户进行Windows服务器身份验证,语法如下:scp file.ext ad_user@domain.subdomain.com@windows_IP:file.ext(是的,有2个@符号!!) - objectNotFound
如果您尝试将文件粘贴到C驱动器中,可能会出现权限错误,因此建议您将文件粘贴到其他目录中。 - Mujeeb Ishaque

15

你可以使用类似下面这样的东西

scp -r linux_username@linux_address:path/to/file path/to/local/directory

这将把 file 复制到您当前工作的系统上指定的本地 directory

-r 标志告诉 scp 在远程 file 是目录时进行递归复制。


9

Windows本身不支持SSH/SCP/SFTP。你是否在运行一个SSH服务器应用程序?如果是,其中一个配置选项可能是根目录,你需要指定相对于该根目录的路径。无论如何,请查阅你在Windows上运行的SSH服务器应用程序的文档。

或者,使用smbclient将文件推送到Windows共享中。


21
Windows本身不支持SSH/SCP/SFTP,Linux或其他操作系统也一样需要相关服务才能使用。 - Joey
@Joey - 我见过的Linux发行版想连接互联网但没有预先安装SSH/SCP/SFTP的次数是零吗? 如果您认为Linux或macOS不支持这些功能,那么您要么很无知,要么就是对“本地支持”一词的争论已经结束。 - ArtOfWarfare
2
@ArtOfWarfare 我相当确定Ubuntu默认没有安装SSH服务器。SSH客户端是有的,但没有服务器。 - Bruno Finger
@BrunoFinger - 我几天前刚安装了Lubuntu,我可以确认它默认没有SSH服务器。但是Lubuntu是Ubuntu的一个非常简化的安装版本 - 我故意选择它,因为它的安装占用空间非常小。我认为大多数其他预构建的配置已经安装了它,在任何情况下,安装ssh服务器只需要一条命令(从我的记忆中,我认为它是sudo apt-get install sshd)。几秒钟后,我就能够从另一台计算机上进行SSH连接。 - ArtOfWarfare
2
@Joey 尽管如此,这个答案还是很有用的,因为即使在专业版 SKU 中,Windows 也会将 sshd 服务作为可选安装进行发布。(我想知道企业版是否默认启用它)。这很容易被忽视,因为许多其他平台默认启用了此服务,所以需要提醒一下。用户必须前往“设置/应用程序/可选功能”并安装“OpenSSH 服务器”。此外,该服务必须被启动,并应设置为自动启动。 - cycollins

4

我曾经像Hesham的文章中那样使用pscp,一旦我下载并安装了putty。由于我是在Windows上从Linux传输文件到Windows,因此我输入了以下命令:

c:\ssl>pscp username@linuxserver:keenan/ssl/* .

这将把 keenan/ssl 文件夹中的所有内容复制到本地文件夹 (.),该命令是从 c:\ssl 执行的。keenan/ssl 将指定用户名 user 的主目录文件夹,例如完整路径为 /home/username/keenan/ssl。您可以使用正斜杠 (/) 指定不同的文件夹,如下所示:
c:\ssl>pscp username@linuxserver:/home/username/keenan/ssl/* .

因此,您可以使用:/指定Linux根目录下的任何文件夹。


4
你的代码无法运行,因为c:/或d:/在Linux中完全不正确,只需使用/mnt/c或/mnt/d

从你的本地Windows10-Ubuntu bash使用以下命令:

下载: (从你的远程服务器文件夹到d:/ubuntu):

scp username@ipaddress:/folder/file.txt /mnt/d/ubuntu

如果需要,输入远程服务器的密码。

上传文件: (从d:/ubuntu到远程服务器):

scp /mnt/d/ubuntu/file.txt username@ipaddress:/folder/file.txt 

如果需要,输入远程服务器密码。 注意:我进行了测试,它可以正常工作。


4

对于所有已经完全安装了“Git Bash”的用户:您可以直接输入:

scp login@ip_addres:/location/to/folders/file.tar .

(在末尾添加空格和句号以复制到当前位置)。然后只需添加证书(y),输入密码即可。


1
这对于被困在Win环境中的人来说是一个简单而伟大的解决方案,特别是git bash可以很容易地以便携模式获得,适用于那些没有管理员权限的工作人员。谢谢! - kurp

2

正如@Hesham Eraqi所建议的那样,这种方法对我有效(从Ubuntu转移到Windows(我尝试在该答案中添加评论,但由于声望问题,我无法添加)):

pscp -v -r -P 53670 user@xxx.xxx.xxx.xxx:/data/genetic_map/sample/P2_283/* \\Desktop-mojbd3n\d\cc_01-1940_data\

where:

-v: 显示详细信息。
-r: 递归复制目录。
-P: 连接到指定端口。
53670: 连接Ubuntu服务器的端口号。
\\Desktop-mojbd3n\d\genetic_map_data\: 我需要传输到外部硬盘,因此我必须给予该设备共享权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接