【VBScript(WSH)】コマンドプロントからSFTPでファイルをアップロードする方法

【VBScript(WSH)】コマンドプロントからSFTPでファイルをアップロードする方法

Windows10ではコマンドプロントからssh接続ができるようになりました。
という事はSFTPだっていけるって事だよね。で、やってみたら簡単に成功。
秘密鍵なしの方法って意外と資料記事が少ないのでメモしておきます。

下準備:SSH接続できるようにする

下準備は次の2つのみです。

  1. PCのユーザーHomeに.ssh フォルダを作成
  2. .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と同じスクリプトで行けるから作るのはそっちの方向だな。

さぁ、今日も頑張ろう!

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください