【VBScript(WSH)】コマンドプロントからSFTPでファイルをアップロードする方法
【VBScript(WSH)】コマンドプロントからSFTPでファイルをアップロードする方法
Windows10ではコマンドプロントからssh接続ができるようになりました。
という事はSFTPだっていけるって事だよね。で、やってみたら簡単に成功。
秘密鍵なしの方法って意外と資料記事が少ないのでメモしておきます。
下準備:SSH接続できるようにする
下準備は次の2つのみです。
- PCのユーザーHomeに.ssh フォルダを作成
- .ssh\configに接続情報を記載
PCのユーザーHomeに.ssh フォルダを作成
cd %homedrive%%homepath% mkdir .ssh
コマンドプロントからの操作だったらこれでOK。
右クリック>>新規作成>>フォルダ で作成しても問題ありません。
秘密鍵がある場合はこの.sshフォルダにコピーを保存しておきます。
無い場合は次のconfigの設定で秘密鍵の記載をしないだけなので問題ありません。
(ログイン時にパスワードを求められるのでその対応をすれば問題なくSFTPが使えます)
.ssh\configに接続情報を記載
秘密鍵がある場合
Host 接続名1
HostName ホスト名
User ユーザー名
IdentityFile C:\Users\ユーザー名\.ssh\秘密鍵のファイル名
Port ポート番号
TCPKeepAlive yes
IdentitiesOnly yes
Host 接続名2
HostName ホスト名
User ユーザー名
IdentityFile C:\Users\ユーザー名\.ssh\秘密鍵のファイル名
Port ポート番号
TCPKeepAlive yes
IdentitiesOnly yes
秘密鍵がない場合
Host 接続名
HostName ホスト名
User ユーザー名
Port ポート番号
TCPKeepAlive yes
IdentitiesOnly no
接続先が複数ある場合は【改行&Host接続名】で別の接続先を記載する
sftp接続を実行してみる
コマンドプロントで次のコードを打つだけで接続に入ります。
>sftp 接続名
接続が実行されるとパスワード入力など次のアナウンスが出てくるので従いましょう。
SFTP操作のコマンド
| コマンド | 指示内容 | 備考 |
|---|---|---|
| ls | リモートサーバのファイルリスト取得 | |
| cd | リモートサーバのディレクトリ移動 | [cd(のみ)] ユーザーHomeへの移動 [cd ~] ユーザーHomeに移動せず怒られる [cd /] ドライブ直下に移動 |
| lls | ローカルのファイルリスト取得 | |
| lcd | ローカルのディレクトリ移動 | [lcd c:/] でC:\への移動 [lcd(のみ)] でユーザーHomeへ移動 [lcd c:\] だとどこにも移動しない |
| get | リモートサーバーからファイルUplode | get リモートサーバ上のファイル名 |
| put | リモートサーバーへファイルUplode | put ローカルのファイル名 |
注意点
備考にも書きましたが【 lcd c:\ 】と打ってもCドライブ直下へ移動しません。※全く移動を行わない
これはディレクトリの区切りが【\】ではなく【/】だからの様です。
その為、Cドライブ直下へ移動したいときは【lcd c:/】とします。
アップロード(ダウンロード)時にファイル名を変えたい場合
アップロードやダウンロード時に名前を変える
'ローカルへのダウンロードの場合' sftp> get ターゲットファイル名 保存時ファイル名 'リモートサーバーへのアップロードの場合' sftp> put ローカルファイル名 保存時ファイル名
操作対象のファイル名に続けて【 半角スペース + 変更名 】とするだけで変更名で保存を掛けてくれます。
例えばこんな時に便利です。
- ファイル名は日付が入っているけど、サーバー側の自動処理の関係でUplodeデータには日付を入れたくない
日付を外した状態で保存してあげれば良いだけなので、これだけで解決できます。
VBScriptで書いてみる
Option Explicit
Dim objShell
Dim sftpName 'アクセス名'
Dim LoginPASS 'パスワード'
Dim serverDirectory 'サーバーDirectory'
Dim localDirectory 'ローカルDirectory'
Set objShell = WScript.CreateObject ("WScript.Shell")
'ID/PASS取得※前工程から引数で渡している場合'
sftpName = Wscript.Arguments(0)
LoginPASS = Wscript.Arguments(1)
serverDirectory = Wscript.Arguments(2)
localDirectory = Wscript.Arguments(3)
objShell.run "cmd.exe"
WScript.Sleep 2000
'sftp接続'
objShell.SendKeys( "sftp "&sftpName)
WScript.Sleep 1000
objShell.SendKeys( "{Enter}")
WScript.Sleep 2000
objShell.SendKeys(LoginPASS)
WScript.Sleep 500
objShell.SendKeys( "{Enter}")
WScript.Sleep 2000
'ファイルUpload'
'データ保存先へ移動(ローカルホストの調整)'
objShell.SendKeys( "lcd "&localDirectory)
WScript.Sleep 1000
'データ保存先へ移動(サーバー側の調整)'
objShell.SendKeys( "cd "&localDirectory)
WScript.Sleep 1000
'ローカルのstock.csv をアップロードしファイル名 ProductStoc.csv にする'
objShell.SendKeys( "put stock.csv ProductStoc.csv")
'sftp閉じる
objShell.SendKeys( "exit")
objShell.SendKeys( "{Enter}")
'コマンドプロント閉じる
objShell.SendKeys( "exit")
objShell.SendKeys( "{Enter}")
Set objShell = Nothing'
キーボード操作を追っただけですけどコレで接続とuplodeが実行できます。
VBScriptでコマンドプロントを起動
Set objShell = WScript.CreateObject ("WScript.Shell")
objShell.run "cmd.exe"
起動は空のオブジェクトを用意してcmd.exeをRUNするだけです。
接続先が固定の場合はこの後ろに接続コードを書けば1行でSFTP接続まで動きます。
Set objShell = WScript.CreateObject ("WScript.Shell")
objShell.run "cmd.exe sftp sftpName"
'または'
objShell.run "cmd.exe sftp ログインユーザー名@接続サーバー"
まとめ
Windows10だと超簡単にSSH接続が可能です。
標準で入っているってすごい楽!
ただ、私が本当に動かしたいのはWindows Server 2016 だったりします。
だってねぇ、社内のローカルサーバーに入れてDB関連の連携処理を自動化させれば快適でしょ。
PC起動してない時間帯にも動かせますから色んなこと出来てしまいます。
で、これをシステム屋に外注すると100万超えると言われてしまったので自分で作ろうとなったんですよね。
WinServerだとOpenShell?
コマンドプロントで動かせるようにすればクライアントPCと同じスクリプトで行けるから作るのはそっちの方向だな。
さぁ、今日も頑張ろう!


