我正在尝试从远程服务器通过scp命令将文件传输到我的本地机器。只有80端口是可访问的。
我尝试了:
scp -p 80 username@www.myserver.com:/root/file.txt .
但收到了这个错误:cp: 80: No such file or directory
如何在scp命令中指定端口号?
与ssh不同,scp使用大写的P开关来设置端口,而不是小写的:
scp -P 80 ... # Use port 80 to bypass the firewall, instead of the scp default
小写的p开关用于scp以保留时间和模式。以下是scp手册页中关于这两个开关的所有细节摘录,以及为什么选择大写的P作为scp的解释:
-P 端口
指定连接到远程主机的端口。请注意,此选项用大写字母’P’书写,因为-p已经保留用于在rcp(1)中保留文件的时间和模式。保留修改时间、访问时间和模式来自原始文件。
附加提示:如何确定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,并且假设你没有通过其他方法获得管理权限),你只会看到以你为所有者的套接字的程序名称。属于其他用户的套接字的程序名称将不会显示(即,将被隐藏,并显示一个占位符破折号)。
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 -
...
更新和附注以解决其中一个(大量投票)评论:关于Abdul l关于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)手册页中明确指出的那样,其后所有后续命令行参数都被视为非选项(和非选项参数)。因此,getopt(1)将示例视为选项结束和参数开始由灰色文本分隔:
scp -r some directory -p 80 ...
这与scp行为无关,而是与POSIX标准应用程序如何使用getopt(3) C函数集解析命令行选项有关。有关命令行顺序和处理的更多详细信息,请使用以下命令阅读getopt(1)手册页:
man 1 getopt