协慌网

登录 贡献 社区

指定端口号的 scp

我正在尝试将文件从远程服务器发送到本地计算机。仅可访问端口 80。

我试过了:

scp -p 80 [email protected]:/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 手册页的摘录,其中包含有关两个开关的所有详细信息,并解释了为什么为 scp 选择大写 P:

-P 端口指定要在远程主机上连接的端口。请注意,此选项用大写字母 “P” 编写,因为 - p 已保留用于保留 rcp(1)中文件的时间和模式。

-p 保留原始文件的修改时间,访问时间和模式。

更新并搁置以解决(严重反对)评论之一

关于阿卜杜勒对scp期权订单的评论,他的建议是:

scp -P80 -r some_directory -P 80 ...

...,穿插选项和参数。 getopt(1)清楚地定义了参数必须在选项之后,并且不能与它们一起使用:

调用参数 getopt 可以分为两个部分:修改 getopt 进行解析方式的选项(SYNOPSIS 中的选项和 optstring),以及要解析的参数(SYNOPSIS 中的参数)。第二部分将从不是选项参数的第一个非选项参数开始,或者在第一次出现 “-” 之后。如果在第一部分中没有找到 “-o” 或 “--options” 选项,则将第二部分的第一个参数用作简短选项字符串。

由于-r命令行选项不包含其他参数,因此some_directory是 “不是选项参数的第一个非选项参数”。因此,正如getopt(1)手册页中明确指出的那样,所有紧随其后的命令行参数(即-P 80 ... )都假定为非选项(和非选项参数)。

因此,实际上,这是getopt(1)看到示例的示例,该示例显示了选项的末尾和参数的开始,并以灰色的后续文本 bing 划出了界限:

scp -P80 -r some_directory -P 80 ...

这与scp行为无关,与 POSIX 标准应用程序如何使用 C 函数的getopt(3)集解析命令行选项无关。

有关命令行排序和处理的更多详细信息,请使用以下内容阅读getopt(1)页:

man 1 getopt

另一个提示。不管您要挂入的计算机是否是第二台计算机(也称为目标计算机),在 scp 命令后都放置 “-P” 选项。例:

scp -P 2222 /absolute_path/source-folder/some-file [email protected]:/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 [email protected]:/root/file.txt .

要么

scp short:/root/file.txt .

您可以通过 ssh,scp,rsync,git 等在 “主机” 行上使用任何东西

您可以在配置文件中使用许多配置选项,请参见:

man ssh_config