2023-04-14 05:00:00

指定端口号的SCP

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

我试着:

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

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

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


当前回答

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

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

其他回答

与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

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

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

答案有很多,但你应该保持简单。确保您知道SSH正在侦听的端口,并定义它。这是我用来复制你的问题的。

scp -P 12222 file.7z user@193.168.X.X:/home/user/下载 结果很好。

我使用不同的端口然后标准和复制文件之间的文件,像这样:

scp -P 1234 user@[ip address or host name]:/var/www/mywebsite/dumps/* /var/www/myNewPathOnCurrentLocalMachine

这只是偶尔使用,如果它根据计划重复自己,您应该使用rsync和cron作业来完成它。

scp -P 22 -r DIR  huezo@192.168.1.100:/home/huezo

scp -P PORT -r DIR  USER@IP:/DIR