WinSCPスクリプトで複数サーバに資材を転送する

同じ資材を複数のサーバにSCPパスワード認証)で転送する方法です。
WinSCPスクリプトのみ使用します。

はじめに

業務でシステム更改案件が増えてきていますが、特にセキュリティに関わる部分について現行の仕組み運用を変えたくないという場面によく遭遇します。

各サーバへの資材リリースも、「Jenkinsを導入してscpジョブを作る」ことは出来ず、現状使っているツールのみで効率化する必要があったりします。

  1. リリース端末のOSWindows10OpenSSH 7.7」標準搭載
  2. サーバへのSSH接続の認証方式パスワード認証方式
  3. リリース端末は閉域網にありソフトウェアのインストールはハードルが高い
  4. WinSCPは既に使っているため使用可能

リリース端末に「OpenSSH 7.7」が標準搭載だったためこれを使用し、パスワードは自動入力にしようとしました。

が、WindowsコマンドプロンプトPowerShellパスワード自動入力をソフトウェアの追加なしで行おうとしましたが上手くいかずorz

切り替えて、WinSCPスクリプトを作って転送することにしました。

ソースコード

WinSCPスクリプト

原則、どのサーバに対しても「同じ資材を同じ場所に転送する」という前提で、資材転送先サーバで行う操作を記載します。

fileSend.scr
# ローカルエコーon
option echo on

# バッチモードoff
option batch on

# 確認無効
option confirm off

# 接続先のディレクトリを変更
cd /home/user01

# バイナリ転送
option transfer binary

# 転送実行
# NAS(192.168.10.1)の900_ReleaseItem\ap\配下のファイルを全て/home/user01配下に転送する
put \\192.168.10.1\900_ReleaseItem\ap\*

# セッション切断
close

# コンソールを閉じる
exit

各設定値の詳細は公式サイトで確認できます。

認証情報ファイル

SSHの認証情報を記載したファイルを用意します。

connectInfo.dat
# 記載方法
# [ユーザ]:[パスワード]@[ホスト]
user01:password01@host01
user01:password01@host02

WindowsBatch

認証情報ファイル(connectInfo.dat)を読み込み、ファイルの行単位にサーバに接続し、WinSCPスクリプト(fileSend.scr)を実行します。

fileSend.bat
@echo off

for /f "eol=#" %%i in (connectInfo.dat) do (
    "C:\Program Files (x86)\WinSCP\WinSCP.exe" scp://%%i /console /script=.\fileSend.scr
)

pause

実行方法

前提)

「C:\Program Files (x86)」配下に「WinSCP」フォルダが来るように「WinSCP」をインストールしておく

実行方法)

fileSend.scr、connectInfo.dat、fileSend.batを同じフォルダに格納し、「fileSend.bat」をダブルクリックする。

WinSCPスクリプトでループ処理はできるか

転送先サーバ内の複数のディレクトリに資材を転送することを想定したら、WindowsBatchから転送先ディレクトリ/転送資材の情報をパラメータで渡し、WinSCPスクリプト内でループ処理したい考えますが、WinSCP日本語Wikiを見る限りWinSCPスクリプト単体でのループ処理は出来ないようです。

代わりに、「WinSCPnet.dll」というライブラリが用意されているので、これをPowerShellなどから呼ぶ出すことでループ処理などを実現できるようです。

鍵認証方式の場合

今回、SSHが「パスワード認証方式」であったためWinSCPスクリプトを使用しましたが、SSHが「鍵認証方式」の場合はWindows10OpenSSH 7.7」をPowerShellで使用して実現する方が、ループ処理条件分岐なども記述出来て汎用性高く作れるかと思います。

コメント

タイトルとURLをコピーしました