与 ssh 不同,scp 使用大写的 P 开关来设置端口,而不是小写的 p:
scp -P 80 ... # Use port 80 to bypass the firewall, instead of the scp default
小写的 p 开关与 scp 一起使用以保存时间和模式。
以下是 scp 手册页的摘录,其中包含有关这两个开关的所有详细信息,以及为什么为 scp 选择大写 P 的解释:
-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 -
...
更新并搁置以解决(高度赞成的)评论之一:
关于 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 命令之后放置“-P”选项,无论您 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 协议路径指定端口:scp://[user@]host[:port][/path]
来自 man scp:
源和目标可以指定为本地路径名、具有 [user@]host:[path] 形式的可选路径的远程主机,或 scp://[user@]host[:port] 形式的 URI [/小路]。本地文件名可以使用绝对或相对路径名明确,以避免 scp 将包含 `:' 的文件名视为主机说明符。
例子:
scp local/filename scp://user@acme.com:22222/path/to/filename
scp scp://userA@foo.com:22222/path/to/filename scp://userB@bar.com:33333/path/to/filename
请注意,如果您的路径来自 /root
,则您的路径中需要有两个 /
。例如,
scp local/filename scp://user@acme.com:22222//root/path/to/filename
如果您需要将本地文件复制到服务器(指定端口)
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 SourceFile remoteuser@remotehost:/directory/TargetFile
复制 文件 来自 主机:scp user@host:/directory/SourceFile TargetFile
复制 目录 递归地 从 主机:scp -r user@host:/directory/SourceFolder TargetFolder
注意: 如果 主机 使用 一个 端口 其他 不是 端口 22, 你 可以 指定 它 与 -P 选项1}
希望这会帮助寻找完美答案的人
将文件夹或文件从定义了端口的服务器复制到另一台服务器或本地计算机
转到您具有管理员权限的目录,最好是您要复制文件的机器上的主目录 编写以下命令
scp -r -P 端口 user@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.XX:/home/user/Downloads 效果很好。
scp -P 22 -r DIR huezo@192.168.1.100:/home/huezo
scp -P PORT -r DIR USER@IP:/DIR
scp
要求正确的选项顺序:scp -r some_directory -P 80 ...
不起作用 ----- 但scp -P 80 -r some_directory ...
起作用。-P
参数顺序的答案。基本上,端口必须在主机之前。如果两个主机都是远程的,这既可以防止歧义,又允许使用两个-P
参数。