【发布时间】:2012-05-07 15:14:31
【问题描述】:
我正在尝试将文件从远程服务器 scp 到我的本地计算机。只能访问 80 端口。
我试过了:
scp -p 80 username@www.myserver.com:/root/file.txt .
但出现此错误:cp: 80: No such file or directory
如何在 scp 命令中指定端口号?
【问题讨论】:
-
端口应该大写-P 80
我正在尝试将文件从远程服务器 scp 到我的本地计算机。只能访问 80 端口。
我试过了:
scp -p 80 username@www.myserver.com:/root/file.txt .
但出现此错误:cp: 80: No such file or directory
如何在 scp 命令中指定端口号?
【问题讨论】:
与 ssh 不同,scp 使用大写的 P 开关来设置端口,而不是小写的 p:
scp -P 80 ... # Use port 80 to bypass the firewall, instead of the scp default
小写的 p 开关与 scp 一起用于保存时间和模式。
这里是 scp 手册页的摘录,其中包含有关这两个开关的所有详细信息,以及为什么选择大写 P 作为 scp 的解释:
-P port 指定要连接到远程主机上的端口。请注意,此选项用大写的“P”编写,因为 -p 已经 保留用于保存 rcp(1) 中文件的时间和模式。
-p 保留原始文件的修改时间、访问时间和模式。
额外提示:如何确定/SSH 守护程序使用的端口来接受 SSH 连接?
可以使用netstat 实用程序来回答这个问题,如下所示:
sudo netstat -tnlp | grep sshd
或者,使用更易读的基于单词的 netstat 选项名称:
sudo netstat --tcp --numeric-ports --listening --program | grep sshd
您将看到的输出,假设您的 ssh 守护程序配置了其侦听端口的默认值,如下所示(稍微修剪列之间的空白,以便使整个表可见,而不必滚动):
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State ID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 888/sshd: /usr/sbin
tcp6 0 0 :::22 :::* LISTEN 888/sshd: /usr/sbin
重要提示
对于上述示例,sudo 用于以管理员权限运行 netstat,以便能够查看所有的程序名称。如果您以普通用户身份运行 netstat(即,没有 sudo 并假设您没有通过其他方法授予您管理员权限),您将只会看到以您的 UID 作为所有者的套接字显示的程序名称。属于其他用户的套接字的程序名称将不会显示(即,将被隐藏并显示占位符连字符):
Proto Recv-Q Send-Q Local Address Foreign Address State ID/Program name
tcp 0 0 127.0.0.1:46371 0.0.0.0:* LISTEN 4489/code
...
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
...
更新并搁置以解决(高度赞成的)cmets 之一:
关于 Abdull 关于scp 期权顺序的评论,他的建议是:
scp -r some_directory -P 80 ...
...,散布选项和参数,因为-r 开关不接受附加参数,some_directory 被视为命令的第一个参数,使-P 和所有后续命令行参数看起来像附加参数到命令(即,连字符前缀的参数不再被视为开关)。
getopt(1) 明确定义参数必须在 选项(即开关)之后,并且不能随意穿插其中:
调用 getopt 的参数可以分为两部分:修改 getopt 解析方式的选项(SYNOPSIS 中的选项和 optstring),以及要解析的参数(SYNOPSIS 中的参数)。第二部分将从 第一个不是选项参数的非选项参数,或者在第一次出现“--”之后。如果第一部分没有找到“-o”或“--options”选项,则将第二部分的第一个参数用作短选项字符串。
由于-r 命令行选项不接受更多参数,some_directory 是“第一个不是选项参数的非选项参数”。因此,正如getopt(1) 手册页中明确说明的那样,所有后续的命令行参数(即-P 80 ...)都被假定为非选项(和非选项参数)。
因此,实际上,getopt(1) 是这样看待示例的,其中选项结尾和参数开头由灰色文本分隔:
scp -r some_directory -P 80 ...
这与scp 行为无关,而与 POSIX 标准应用程序如何使用 getopt(3) 一组 C 函数解析命令行选项有关。
有关命令行排序和处理的更多详细信息,请阅读getopt(1) 联机帮助页:
man 1 getopt
【讨论】:
scp 要求正确的选项顺序:scp -r some_directory -P 80 ... 不起作用 ----- 但 scp -P 80 -r some_directory ... 起作用。
-P 参数排序。基本上,端口必须在主机之前。这既可以防止歧义,又可以在两个主机都是远程的情况下使用两个 -P 参数。
一个额外的提示。将“-P”选项放在 scp 命令之后,无论您 ssh 进入的机器是否是第二台(也称为目标)。示例:
scp -P 2222 /absolute_path/source-folder/some-file user@example.com:/absolute_path/destination-folder
【讨论】:
你知道什么比-P 更酷吗?什么都没有
如果您多次使用此服务器,请设置/创建一个 ~/.ssh/config 文件,其条目如下:
Host www.myserver.com
Port 80
或
Host myserver myserver80 short any.name.u.want yes_anything well-within-reason
HostName www.myserver.com
Port 80
User username
那么你可以使用:
scp username@www.myserver.com:/root/file.txt .
或
scp short:/root/file.txt .
您可以使用 ssh、scp、rsync、git 等“主机”行上的任何内容
您可以在配置文件中使用许多配置选项,请参阅:
man ssh_config
【讨论】:
scp -3 的解决方案。 scp -3 -P 123 server1:/file -P 456 server2:/file 或类似的替代方案不起作用,scp 假定两台服务器上的端口相同
我使用不同的端口,然后是标准的,并在文件之间复制文件,如下所示:
scp -P 1234 user@[ip address or host name]:/var/www/mywebsite/dumps/* /var/www/myNewPathOnCurrentLocalMachine
这仅用于偶尔使用,如果它根据计划重复,您应该使用 rsync 和 cron 作业来执行它。
【讨论】:
要在 scp 命令上使用另一个端口,请像这样使用大写 P
scp -P port-number source-file/directory user@domain:/destination
你好
【讨论】:
这可以通过-P 开关指定端口来实现:
scp -i ~/keys/yourkey -P2222 file ubuntu@host:/directory/
【讨论】:
scp help告诉我们端口是由大写的P指定的。
~$ scp
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2
希望这会有所帮助。
【讨论】:
将文件复制到主机:
scp SourceFile remoteuser@remotehost:/directory/TargetFile
从主机复制文件:
scp user@host:/directory/SourceFile TargetFile
从主机递归复制目录:
scp -r user@host:/directory/SourceFolder TargetFolder
注意:如果主机使用的端口不是 22 端口,您可以使用 -P 选项指定它:
scp -P 2222 user@host:/directory/SourceFile TargetFile
【讨论】:
如果您需要将本地文件复制到服务器(指定端口)
scp -P 3838 /the/source/file username@server.com:/destination/file
【讨论】:
使用不同的远程端口将所有目录中的所有文件备份到远程 Synology NAS:
scp -P 10022 -r /media/data/somedata/* user@192.168.1.x:/var/services/homes/user/directory/
【讨论】:
希望这将有助于寻找完美答案的人
将文件夹或文件从具有定义端口的服务器复制到另一台服务器或本地计算机
scp -r -P 端口用户@IP_address:/home/file/pathDirectory .
**Note:** The last . on the command directs it to copy everything in that folder to your directory of preference
【讨论】:
有很多答案,但你应该能够保持简单。确保您知道什么端口 SSH 正在侦听并定义它。这是我刚刚用来复制您的问题的内容。
scp -P 12222 file.7z user@193.168.X.X:/home/user/Downloads 结果很好。
【讨论】: