1. ホーム
  2. port

[解決済み】ポート番号を指定したscp

2022-03-23 03:23:06

質問

リモートサーバーから私のローカルマシンにファイルをscpしようとしています。ポート80のみがアクセス可能です。

試してみました。

scp -p 80 [email protected]:/root/file.txt .

が、このようなエラーが発生しました。 cp: 80: No such file or directory

scpコマンドでポート番号を指定するにはどうすればよいですか?

どのように解決するのですか?

sshと違い、scpではポートの設定に小文字のpではなく、大文字のPスイッチを使用します。

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

小文字のpスイッチは、時間とモードの保存のためにscpで使用されます。

この2つのスイッチに関するすべての詳細と、scpに大文字のPが選ばれた理由については、scpのmanページからの抜粋をご覧ください。

<ブロッククオート

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

更新と余談:(大きくupvotedされた)コメントの1つに対応するため :

に関するAbdullのコメントについて。 scp オプションの順序、彼が提案するもの。

scp -r some_directory -P 80 ...

...は、オプションとパラメータを挟み込んでいます。 -r スイッチは追加の引数を取らず some_directory はコマンドの最初のパラメータとして扱われます。 -P とそれに続くすべてのコマンドライン引数は、コマンドの追加パラメータのように見えます(つまり、ハイフンで始まる引数は、もはやスイッチとはみなされません)。

getopt(1) は、パラメータが の後に オプション(つまりスイッチ)の中に、無造作に挟み込まないでください。

getopt が呼び出されるときのパラメータは、getopt がパースする方法を変更するオプション (SYNOPSIS のオプションと optstring) と、パースされるパラメータ (SYNOPSIS のパラメータ) の 2 つに分けて考えることができます。 2番目の部分は オプション引数でない最初のパラメータ、あるいは'--'が最初に現れた後である。 最初の部分で '-o' または '--options' オプションが見つからなかった場合、 2番目の部分の最初のパラメータが短いオプション文字列として使われる。

というのは -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