🌐

SCPコマンドを使ってローカルとEC2でファイルのやりとりをする方法

2023/02/14に公開

AWSナンモワカランの人がインターンでEC2上での作業をしなくなったので、SSHに関する初めの第一歩の半歩くらいのお話を書きます。

状況としては接続先アドレスとpemファイルを渡されてこれ使ってSSH接続したら普通に使えるからって言われたところからです。

SSH接続

ssh接続は.sshディレクトリにpemファイルを置いて、sshコマンドを実行すればできます。詰まるとすれば.sshの場所とパーミッションに関することくらいだと思います。一般的に、.sshはユーザー直下、パーミッションはchmod で600番(所有者の読み書き許可)にしていると思います。

$ ssh -i [秘密鍵.pem] ec2-user@[接続先アドレス]

ここでsshコマンドのオプションに指定している-i は秘密鍵ファイルを指定するオプションだそうです。その他のコマンドは次の記事なんかを参考にしてみてください。

https://webkaru.net/linux/ssh-command/

また、今回ec2-user としている部分はユーザー名なのですが、これはAWS上で使用しているマシンイメージによって変わる部分です。このユーザー名には次の公式ドキュメントにのっているようなものがあります。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connection-prereqs.html

これでssh接続ができました。

scpコマンドによるファイルの送受信

ssh接続しているリモートマシンとローカルのマシンでファイルの送受信をしたくなることがあると思います。そういったときにはscpコマンドを使用します。scpコマンドはssh通信を使用してファイルのコピーが行えるコマンドです。今回の状況では次のように使います。

$ scp -i [秘密鍵.pem] コピー元パス 保存先パス

オプションとして-i を指定していますが、これはsshコマンドと同様の意味です。(scpコマンドでも秘密鍵に関するオプションを指定しないといけないということを知らずに困ったのがこれを書こうと思った要因です。)また、scpコマンドのオプションについて述べている記事を一つ参考として置いておきます。

https://itc.tokyo/linux/scp-command/

リモートマシンのパスを指定するときは、パスの先頭に ユーザ名@サーバのホスト名(or IPアドレス): をつけます。以下コマンド例です。

リモートにあるtest.txtをローカルのhogeディレクトリにコピー

$ scp ec2-user@[接続先アドレス]:~/test.txt ./hoge/

ローカルのカレントディレクトリにあるtest.txtをリモートのホームディレクトリにコピー

$ scp test.txt ec2-user@[接続先アドレス]:~/

今回はファイルのコピー例を挙げましたが、ディレクトリのコピーも可能です。その際にはオプションとして-r を指定してください。
これでssh接続しているEC2へファイルの送受信ができるようになりまいた。

おまけ VSCodeを使ったEC2への接続

普段VSCodeを使ってコードを書いているのであれば、VSCodeからEC2へ接続した方が使い勝手がいいです。今回scpコマンドを使った行った操作もGUI操作で完結でき非常に便利。VSCodeの拡張機能である「Remote - SSH」を使ってターミナルから接続するのに使用したsshコマンドを打つだけで一瞬で接続も終わります。以下参考記事です。
https://qiita.com/takao-takass/items/9f81d5095924280966ae

configファイルを書いて接続する場合は以下のように記述すれば接続できます。

Host [分かりやすい名前を適当に]
    HostName [接続先アドレス]
    IdentityFile ~/.ssh/[秘密鍵.pem]
    User ec2-user

Discussion