2023-04-14 05:00:00

指定端口号的SCP

我试图scp文件从远程服务器到我的本地机器。只有80端口可访问。

我试着:

scp -p 80 username@www.myserver.com:/root/file.txt .

cp: 80:没有这样的文件或目录

如何在scp命令中指定端口号?


当前回答

如果需要将本地文件复制到服务器(指定端口)

scp -P 3838 /the/source/file username@server.com:/destination/file

其他回答

与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 

重要提示

For the above examples, sudo was used to run netstat with administrator privs, in order to be able to see all of the Program Names. If you run netstat as a regular user (i.e., without sudo and assuming you don't have admin rights granted to you, via some other method), you will only see program names shown for sockets that have your UID as the owner. The Program Names for sockets belonging to other users will not be shown (i.e., will be hidden and a placeholder hyphen will be displayed, instead):

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)清楚地定义了参数必须在选项(即开关)之后,而不能随意地与它们穿插在一起:

The parameters getopt is called with can be divided into two parts: options which modify the way getopt will do the parsing (the options and the optstring in the SYNOPSIS), and the parameters which are to be parsed (parameters in the SYNOPSIS). The second part will start at the first non-option parameter that is not an option argument, or after the first occurrence of '--'. If no '-o' or '--options' option is found in the first part, the first parameter of the second part is used as the short options string.

由于-r命令行选项没有进一步的参数,some_directory是“第一个不是选项参数的非选项参数”。因此,正如getopt(1)手册页中明确指出的那样,所有随后的命令行参数(即-P 80…)都被假定为非选项(以及非选项参数)。

因此,实际上,这就是getopt(1)如何看待以灰色文本划分的选项结尾和参数开头的示例:

scp -r some_directory -P 80…

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

有关命令行排序和处理的更多细节,请使用以下命令阅读getopt(1) manpage:

man 1 getopt

这可以通过-P开关指定port来实现:

scp -i ~/keys/yourkey -P2222 file ubuntu@host:/directory/

如果需要将本地文件复制到服务器(指定端口)

scp -P 3838 /the/source/file username@server.com:/destination/file

复制文件到主机: scp SourceFile remoteuser@remotehost:/directory/TargetFile . xml

从主机复制文件: scp user@host:/directory/SourceFile目标文件

从主机递归复制目录: scp -r user@host:/directory/SourceFolder目标文件夹

注意:如果主机使用的端口不是22,可以使用-P选项指定: scp -P 2222 user@host:/directory/SourceFile目标文件

使用实例使用不同的远程端口将所有目录下的所有文件备份到远端Synology NAS。

scp -P 10022 -r /media/data/somedata/* user@192.168.1.x:/var/services/homes/user/directory/