LoginSignup
1
1

More than 1 year has passed since last update.

【sftp・expect】非対話方式でsftpコマンドを実行する方法

Last updated at Posted at 2022-11-15

はじめに

sftp方式でファイルをダウンロード、接続先のファイル削除までを自動化したかったが、対話方式でしか通信を行ったことがなかった。今回非対話方式でsftpを行う方法知ったのでメモ。
なお、本記事はbashで書くことを目的としている。

ダウンロード

以下でカレントディレクトリにファイルがダウンロードされる。

sftp -i [keyのフルパス] [ユーザ名]@[アクセス先]:[取得したいファイルのフルパス]

アップロード/削除

expect.sh
#!/bin/bash

user="[ユーザ]"
sftp_path="[接続先]"
key_path="[keyのフルパス]"

expect -c "
set timeout 3600 
spawn sftp -i ${key_path} ${user}@${sftp_path}
expect \"sftp>\"
send \"put /home/ubuntu/kobayashi/dammy\r\"
expect \"sftp>\"
send \"rm dammy\r\"
expect \"sftp>\"
send \"bye\r\"
expect eof
exit
"

ここでは非対話方式のsftpコマンドを使用するのではなく、expectを使用して対話を自動化している。

expect

以下のQiitaを参考にさせていただいた。
Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編https://qiita.com › Linux

一応ここでも簡単に解説する。

簡単な解説

expectは、簡潔にいうと対話方式のやり取りを自動でおこなってくれるモノ。
導入は

yum install expect

主な要素は以下。

コマンド 動作
expect -c " ここからexpectで自動化するよーっていうexpectの書き始め。
自動化の最後には必ず"で締める。
set timeout 1つのコマンドがタイムアウトするまでの秒数を設定。デフォルトで10秒。
spawn 自動化対象のコマンドのプロセスを生成。
expect 前のコマンドの応答を受け取る。
指定した文字列を応答が含む場合、次のコマンドを実行する。
send 実行したいコマンドを記述する。
コマンドの後ろに\rを書かないと、前のexpectがタイムアウトするまで実行されないため注意
expect eof
exit
操作の主導権をユーザに戻す。代わりにinteractでも可。(筆者の好み)

メモ

これらを含んだbashはcronで夜間に動かしていたのだが、ユーザをrootにしていたので、sftpでダウンロードされるファイルの格納先がrootになってしまった。
sftpで取得する前にcdでカレントディレクトリを変更することで対応した。
(おそらくsftpコマンドでダウンロード先を指定することができるのだろうが、これで対応できたので調べていない)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1