【问题标题】:scp with port number specified指定端口号的 scp
【发布时间】:2012-05-07 15:14:31
【问题描述】:

我正在尝试将文件从远程服务器 scp 到我的本地计算机。只能访问 80 端口。

我试过了:

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

但出现此错误:cp: 80: No such file or directory

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

【问题讨论】:

  • 端口应该大写-P 80

标签: port scp


【解决方案1】:

与 ssh 不同,scp 使用大写的 P 开关来设置端口,而不是小写的 p:

scp -P 80 ... # Use port 80 to bypass the firewall, instead of the scp default

小写的 p 开关与 scp 一起用于保存时间和模式。

这里是 scp 手册页的摘录,其中包含有关这两个开关的所有详细信息,以及为什么选择大写 P 作为 scp 的解释:

-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 

重要提示

对于上述示例,sudo 用于以管理员权限运行 netstat,以便能够查看所有程序名称。如果您以普通用户身份运行 netstat(即,没有 sudo 并假设您没有通过其他方法授予您管理员权限),您将只会看到以您的 UID 作为所有者的套接字显示的程序名称。属于其他用户的套接字的程序名称将不会显示(即,将被隐藏并显示占位符连字符):

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      -                   
...

更新并搁置以解决(高度赞成的)cmets 之一

关于 Abdull 关于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) 手册页中明确说明的那样,所有后续的命令行参数(即-P 80 ...)都被假定为非选项(和非选项参数)。

因此,实际上,getopt(1) 是这样看待示例的,其中选项结尾和参数开头由灰色文本分隔:

scp -r some_directory -P 80 ...

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

有关命令行排序和处理的更多详细信息,请阅读getopt(1) 联机帮助页:

man 1 getopt

【讨论】:

  • 顺便说一句,scp 要求正确的选项顺序:scp -r some_directory -P 80 ... 不起作用 ----- 但 scp -P 80 -r some_directory ... 起作用。
  • 一般在linux中,命令后跟选项,然后是指令/值
  • @Abdull 注意 scp -r -p 50193 /path/to/directory 也可以。文件路径参数与 -r 递归选项无关。
  • @Benjamin 除非您打算使用端口 50193,在这种情况下您的“p”应该大写。
  • @Abdull:askubuntu.com/a/307078/37574 的答案解释了-P 参数排序。基本上,端口必须在主机之前。这既可以防止歧义,又可以在两个主机都是远程的情况下使用两个 -P 参数。
【解决方案2】:

一个额外的提示。将“-P”选项放在 scp 命令之后,无论您 ssh 进入的机器是否是第二台(也称为目标)。示例:

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

【讨论】:

    【解决方案3】:

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

    如果您多次使用此服务器,请设置/创建一个 ~/.ssh/config 文件,其条目如下:

    Host www.myserver.com
        Port 80
    

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

    那么你可以使用:

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

    scp short:/root/file.txt .

    您可以使用 ssh、scp、rsync、git 等“主机”行上的任何内容

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

    man ssh_config

    【讨论】:

    • 唯一允许在不同端口上使用 ssh 侦听器的服务器使用scp -3 的解决方案。 scp -3 -P 123 server1:/file -P 456 server2:/file 或类似的替代方案不起作用,scp 假定两台服务器上的端口相同
    • 有史以来最好的解决方案,源文件来自远程机器
    【解决方案4】:

    我使用不同的端口,然后是标准的,并在文件之间复制文件,如下所示:

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

    这仅用于偶尔使用,如果它根据计划重复,您应该使用 rsync 和 cron 作业来执行它。

    【讨论】:

      【解决方案5】:

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

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

      你好

      【讨论】:

      • 如何给目的地的端口而不是发件人?
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        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
        

        希望这会有所帮助。

        【讨论】:

          【解决方案8】:

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

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

          从主机递归复制目录: scp -r user@host:/directory/SourceFolder TargetFolder

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

          【讨论】:

          • 只要注意就够了
          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

            使用不同的远程端口将所有目录中的所有文件备份到远程 Synology NAS:

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

            【讨论】:

              【解决方案11】:

              希望这将有助于寻找完美答案的人

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

              1. 转到您在要将文件复制到的计算机上具有管理员权限的目录最好是您的主目录
              2. 在下面编写命令

              scp -r -P 端口用户@IP_address:/home/file/pathDirectory .

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

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-09
                  • 2015-10-08
                  • 2010-09-05
                  • 1970-01-01
                  • 2021-02-26
                  • 2015-09-11
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多