🚛

scpコマンドを、.ssh/configと連携して使う

2024/02/01に公開

.ssh/configファイル[1]を使うと、sshコマンドを短縮することができますが、実はscpコマンドも短縮できるようになります。

まとめ

以下のような.ssh/configファイルを作成しているとします:

Host <リモート短縮名>
  HostName <リモートIP>
  Port <リモートSSHポート番号>
  IdentityFile <公開鍵のパス>
  User <リモートユーザ名>
  Protocol 2

このとき、sshコマンドでもscpコマンドでも同様に、以下の置換ができます:

  • 置換される文字列:

    -p <リモートSSHポート番号> -i <公開鍵のパス> <リモートユーザ名>@<リモートIP>
    
  • 置換後の文字列:

    <リモート短縮名>
    

この置換パターンを踏まえると、リモートホストに対してローカルホスト上から実行するsshコマンド、scpコマンドは、それぞれ以下のように短縮できます:

sshコマンド

  • 短縮前:

    ssh -p <リモートSSHポート番号> -i <公開鍵のパス> <リモートユーザ名>@<リモートIP>
    
  • 短縮後:

    ssh <リモート短縮名>
    

scpコマンド

  • リモートホスト上のファイル/some/remote/fileを、
    ローカルホスト上のディレクトリ/some/local/directory/配下にコピー:

    • 短縮前:

      scp -p <リモートSSHポート番号> -i <公開鍵のパス> \
        <リモートユーザ名>@<リモートIP>:/some/remote/file /some/local/directory/
      
    • 短縮後:

      scp <リモート短縮名>:/some/remote/file /some/local/directory/
      
  • ローカルホスト上のファイル/some/local/fileを、
    リモートホスト上のディレクトリ/some/remote/direcotry配下にコピー:

    • 短縮前:

      scp -p <リモートSSHポート番号> -i <公開鍵のパス> \
        /some/local/file <リモートユーザ名>@<リモートIP>:/some/remote/direcotry/
      
    • 短縮後:

      scp /some/local/file <リモート短縮名>:/some/remote/direcotry/
      

くわしく

sshコマンドと.ssh/config

公開鍵でリモートホストにSSHログインする場合、sshコマンド;

ssh -p <リモートSSHポート番号> -i <公開鍵のパス> <リモートユーザ名>@<リモートIP>

で接続を行います。

ここで、.ssh/configファイル[1:1]を以下のように作成します:

Host <リモート短縮名>
  HostName <リモートIP>
  Port <リモートSSHポート番号>
  IdentityFile <公開鍵のパス>
  User <リモートユーザ名>
  Protocol 2

すると、sshコマンドは以下のように短くすることができます:

ssh <リモート短縮名>

ここで、以下のようなパターンの置き換えが起きていることに注目してください:

  • 置換前:

    -p <リモートSSHポート番号> -i <公開鍵のパス> <リモートユーザ名>@<リモートIP>
    
  • 置換後:

    <リモート短縮名>
    

scpコマンドと.ssh/config

scpコマンドで、リモートホスト上のファイル/some/remote/fileを、ローカルホスト上のディレクトリ/some/local/directory配下に引っ張ってくる場合、ローカルホストで以下のようなコマンドを使います:

scp -p <リモートSSHポート番号> -i <公開鍵のパス> \
  <リモートユーザ名>@<リモートIP>:/some/remote/file /some/local/directory/

ここで、先程の.ssh/configファイル:

Host <リモート短縮名>
  HostName <リモートIP>
  Port <リモートSSHポート番号>
  IdentityFile <公開鍵のパス>
  User <リモートユーザ名>
  Protocol 2

が存在している場合、scpコマンドを以下のように短くすることができます:

scp <リモート短縮名>:/some/remote/file /some/local/directory/

sshコマンドと同じく、以下のようなパターンの置き換えが起きていることに注目してください:

  • 置換前:

    -p <リモートSSHポート番号> -i <公開鍵のパス> <リモートユーザ名>@<リモートIP>
    
  • 置換後:

    <リモート短縮名>
    

これは、ローカルホスト上のディレクトリのファイル/some/local/fileを、リモートホスト上のディレクトリ/some/remote/direcotry配下にコピーする場合も同じです:

  • 短縮前:

    scp -p <リモートSSHポート番号> -i <公開鍵のパス> \
      /some/local/file <リモートユーザ名>@<リモートIP>:/some/remote/direcotry/
    
  • 短縮後:

    scp /some/local/file <リモート短縮名>:/some/remote/direcotry/
    

【おまけ】scpコマンドが覚えられない方へ

scpコマンドの書式の全体像は、「scpコマンド特有のルール2つ」+「sshコマンドの知識を流用できるルール」の2つから成ります。

つまり、sshコマンドを覚えていれば、scpコマンドのマスターもすぐそこです!

scpコマンド特有のルール

短縮形の形;

scp <リモート短縮名>:/some/remote/file /some/local/directory/
scp /some/local/file <リモート短縮名>:/some/remote/direcotry/

を通して、落ち着いてscpコマンドの構造を見ると、

  • cpコマンド風のフォーマット:

    scp <from> <to>
    
  • リモートホスト上のパスの指定方法(コロン:で区切る):

    <リモート短縮名(=リモートホスト接続情報)>:<リモートホスト上のパス>
    

という、(sshコマンドにはない)scp特有の2つのルールが意識しやすいと思います。これは覚えましょう。

sshコマンドの知識を流用できるルール

また、.ssh/configで短縮している<リモート短縮名>で置換していた部分:

-p <リモートSSHポート番号> -i <公開鍵> <リモートユーザ名>@<リモートIP>

は、「『リモートホストにSSH接続するために必要な情報の集まり』をsshコマンドの書式にしたもの」なので、ここは新たに覚える必要はないです。

脚注
  1. SSH config file for OpenSSH client(www.ssh.com):https://www.ssh.com/academy/ssh/config ↩︎ ↩︎

Discussion