ポート番号を指定したscp 質問する

ポート番号を指定したscp 質問する

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

私は試した:

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

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

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

ベストアンサー1

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

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

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

以下は、scp のマニュアル ページからの抜粋です。2 つのスイッチに関するすべての詳細と、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 

重要な注意点

上記の例では、すべてプログラム名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      -                   
...

更新して、(非常に多くの賛成を得た)コメントの 1 つに対応するために補足します

scpオプション注文に関するアブドゥル氏のコメントに関して、彼は次のように示唆しています。

scp -r some_directory -P 80 ...

...、-rスイッチは追加の引数を取らず、some_directoryコマンドの最初のパラメータとして扱われるため、オプションとパラメータが混在し、-P後続のすべてのコマンドライン引数はコマンドへの追加パラメータのように見えます (つまり、ハイフンで始まる引数はスイッチとは見なされなくなります)。

getopt(1)パラメータはオプション(つまりスイッチ)の後に来る必要があり、オプションと無差別に混在してはならないことを明確に定義しています。

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

-rコマンドライン オプションはこれ以上の引数を取らないため、some_directoryは「オプション引数ではない最初の非オプション パラメータ」です。したがって、getopt(1)マニュアル ページに明記されているように、これに続くすべての後続のコマンドライン引数 (つまり、-P 80 ...) は非オプション (および非オプション引数) であると見なされます。

つまり、実際には、getopt(1)オプションの終わりとパラメータの始まりが灰色のテキストで区切られた例は次のようになります。

scp -rsome_directory -P 80 ...

これは動作とは何の関係もなく、POSIX 標準アプリケーションがC 関数のセットscpを使用してコマンド ライン オプションを解析する方法に関係します。getopt(3)

コマンドラインの順序と処理に関する詳細については、次のgetopt(1)マニュアルページを参照してください。

man 1 getopt

おすすめ記事