2023-04-14 05:00:00

指定端口号的SCP

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

我试着:

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

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

如何在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 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 1234 user@[ip address or host name]:/var/www/mywebsite/dumps/* /var/www/myNewPathOnCurrentLocalMachine

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


复制文件到主机: 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目标文件


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

希望这能有所帮助。


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

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

你知道什么比-P更酷吗?没有什么

如果您多次使用此服务器,请设置/创建~/。Ssh /config文件的入口如下:

Host www.myserver.com
    Port 80

or

Host myserver myserver80 short any.name.u.want yes_anything well-within-reason
    HostName www.myserver.com
    Port 80
    User username

然后你可以使用:

SCP用户名@www.myserver.com:/root/file.txt。

or

SCP短:/root/file.txt。

你可以使用任何在“主机”行ssh, scp, rsync, git和更多

你可以在配置文件中使用许多配置选项,请参阅:

男人ssh_config


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

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

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

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

如果要在scp命令上使用另一个端口,请像这样使用大写P

scp -P port-number source-file/directory user@domain:/destination

是的,阿里


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

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

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

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

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

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


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

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


端口可以使用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

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

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