我正在尝试将文件从远程服务器发送到我的本地计算机。只能访问端口 80。
我试过了:
scp -p 80 username@www.myserver.com:/root/file.txt .
但收到此错误:cp: 80: No such file or directory
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 听听 听听 保留原始文件的修改时间、访问时间和模式。
-P 端口 指定要连接到远程主机上的端口。请注意,此选项使用大写的“P”编写,因为 -p 已保留用于在 rcp(1) 中保留文件的时间和模式。
-p 听听 听听 保留原始文件的修改时间、访问时间和模式。
额外提示 :如何确定/SSH 守护进程使用的端口来接受 SSH 连接?
这个问题可以通过使用该netstat实用程序来回答,如下所示:
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
重要的提示
对于上述示例,使用管理员权限运行 netstat ,sudo以便能够查看 所有 程序名称 。如果您以普通用户身份运行 netstat(即,没有 sudo 并且假设您没有通过其他方法授予您管理员权限),您将只会看到以您的 UID 作为所有者的套接字显示的程序名称。属于其他用户的套接字的 程序名称 将不会显示(即,将被隐藏并显示占位符连字符):
sudo
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
scp -r some_directory -P 80 ...
…,散布选项和参数,因为-r开关不接受额外的参数,some_directory并被视为命令的第一个参数,使得-P和所有后续命令行参数看起来像命令的附加参数(即,连字符前缀的参数不再视为开关)。
-r
some_directory
-P
getopt(1)明确定义参数必须 在 选项(即开关)之后,并且不能随意穿插:
getopt(1)
调用 getopt 的参数可以分为两部分:修改 getopt 解析方式的选项(SYNOPSIS 中的选项和 optstring),以及要解析的参数(SYNOPSIS 中的参数)。第二部分将从第一个不是选项参数的非选项参数开始,或者在第一次出现“–”之后开始。如果在第一部分中没有找到“-o”或“–options”选项,则将第二部分的第一个参数用作短选项字符串。
由于-r命令行选项没有进一步的参数,some_directory因此是“第一个不是选项参数的非选项参数”。因此,正如手册页中明确说明的那样,getopt(1)它后面的所有后续命令行参数(即-P 80 ...)都被假定为非选项(和非选项参数)。
-P 80 ...
因此,实际上,这就是以getopt(1)灰色文本划分的选项结尾和参数开头呈现的示例的方式:
scp -rsome_directory -P 80 ...
some_directory -P 80 ...
这与行为无关,scp与 POSIX 标准应用程序如何使用getopt(3)C 函数集解析命令行选项有关。
getopt(3)
有关命令行排序和处理的更多详细信息,请阅读getopt(1)手册页:
man 1 getopt