普段、LenovoのThinkPadのBluetooth ワイアレス・トラックポイント・キーボードを使っており、2020/05に発売されるUSB TypeC版を購入するかを常に迷っている技術課の森です。
はじめに
前回はSFTPサーバに対して、作成したプログラムでファイルをPUTしました。
前回のブログはこちら
今回は ローカルで作成したプログラムでSFTPサーバにあるファイルをGET します。
プログラム
環境/ライブラリ
まずは環境やライブラリについてです。
- virtualenv(20.0.16)
- python(3.7.3)
- paramiko(2.7.1)(Pythonで使うライブラリ)
これを利用してプログラムを作成していきます。 なお、プログラムは異常処理など行っていないので、 利用される際は、適宜異常処理を行ってください。
プログラム
SFTPサーバにあるファイルをプログラム実行ディレクトリ直下にGETするプログラムです。
ファイル名を sftp_get.py
とします。
import paramiko
# 定数定義
## 接続先のSFTPサーバのIPアドレス
HOSTNAME = "xx.xx.xx.xx"
## 接続先のSFTPサーバのポート番号
PORT = 22
## 接続先のSFTPサーバの接続ユーザ名
USERNAME = "sftp-user"
## 接続先のSFTPサーバの接続ユーザ用の秘密鍵
PRIVATE_KEY = 'id_rsa'
## 接続先のSFTPサーバでファイルのPUT/GETできるディレクトリ名
SFTP_DIR = "sftp-work-dir/"
# 接続準備
## SSH接続の準備
transport = paramiko.Transport((HOSTNAME, PORT))
## 秘密鍵の設定
### http://docs.paramiko.org/en/stable/api/keys.html#paramiko.pkey.PKey.from_private_key_file
rsa_private_key = paramiko.RSAKey.from_private_key_file(PRIVATE_KEY)
## SSHで接続
transport.connect(username=USERNAME, pkey= rsa_private_key)
# SFTPでGET
## SFTPクライアント生成
sftp = paramiko.SFTPClient.from_transport(transport)
## SFTPでファイルをGET
sftp.get(SFTP_DIR + "getfile", "./getfile")
## SFTPをクローズ
sftp.close()
## SSHをクローズ
transport.close()
プログラムの実行
では、プログラムを実行していきます。
PUTのときと同様、秘密鍵( id_rsa
)をプログラムの実行ディレクトリに配置します。
その後、GETするファイル( getfile
)をSFTPサーバの sftp-work-dir
配下に配置します。
$python sftp_get.py
実行後の確認
では、まずはSFTPサーバにあるファイルの確認を行います。
$ sftp -i id_rsa sftp-user@[EC2のIPv4パブリックIP] sftp> cd sftp-work-dir sftp> ls -la drwxrwxrwx 2 1001 1001 36 May 7 07:46 . drwxr-xr-x 3 0 0 18 May 7 07:24 .. -rw-r--r-- 1 1001 1001 69 May 7 07:45 getfile
69byteのファイル( getfile
)がサーバ上にありますね。
では、プログラムを実行した結果を確認します。
$ ls -l getfile
-rw-r--r-- 1 localuser staff 69 5 7 16:45 getfile
同じファイルがGETできてました。
ということで、3部作のブログはいかがでしたでしょうか? 無事、サーバ構築/PUT/GETができました。
AWS Transfer for SFTP/FTP/FTPSに触発されて、プログラムを作ってみました。 もう少しチャレンジはしてみようかと思いますが、今回はここまでとします。
さいごに
「SQSトリガーで動くLambda」みたいな感じで、なにかに触発されて行動する感じで今回はプログラムを書いて、動かして、ブログにしてみました。 こういうチャレンジはどんどんしていかないと技術力が平行線から下降線になりますよね。 なので、自分自身を奮い立たせるためにもこれからもいろんなことにチャレンジしていこうと思います。 とは言え、色々チャレンジしてるのですが、ブログでは、プログラミングチャレンジをやっていこうと思います。 では、また次回をご期待あれ。