2023-04-14 05:00:00

指定端口号的SCP

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

我试着:

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

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

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


当前回答

scp help告诉我们端口是由大写的P指定的。

~$ scp
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

希望这能有所帮助。

其他回答

端口可以使用scp协议路径指定:scp://[user@]host[: Port][/path]

源自man scp:

源和目标可以指定为本地路径名、具有可选路径的远程主机(形式为[user@]host:[path])或URI(形式为 scp: / / [user@][:港口][/路径]。本地文件名可以显式使用绝对或相对路径名,以避免scp处理包含':'的文件名: 作为主机说明符。

例子:

scp local/filename scp://user@acme.com:22222/path/to/filename
scp scp://userA@foo.com:22222/path/to/filename scp://userB@bar.com:33333/path/to/filename

注意,如果你的路径是从根开始的,你需要在你的路径中有两个/s。例如,

scp local/filename scp://user@acme.com:22222//root/path/to/filename

另外一个提示。将'-P'选项放在scp命令之后,无论您要ssh-ing到的机器是否是第二个机器(也就是目的地)。例子:

scp -P 2222 /absolute_path/source-folder/some-file user@example.com:/absolute_path/destination-folder

与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

希望这对寻找完美答案的人有所帮助

将具有定义端口的服务器上的文件夹或文件复制到另一台服务器或本地计算机

转到您有管理权限的目录,最好是您想要复制文件的机器上的主目录 编写下面的命令

scp -r -P port user@IP_address:/home/file/pathDirectory。

**Note:** The last . on the command directs it to copy everything in that folder to your directory of preference