« JavaScript for Automation (JXA)でUTF-8テキストの読み書き | トップページ

2018年2月15日 (木)

JavaScript for Automation (JXA)でファイルをFTPアップロード

JXA でも Apple Script 同様、doShellScript 内で curl コマンドを用いてファイルを FTP サーバーにアップローすることはできる。

 app = Application.currentApplication();
 app.includeStandardAdditions = true;
 var localFilePath = "/Users/xxxxx/foo/bar.txt";
 var ftpUser = "xxxxx";
 var ftpPassWord = "papapass";
 var upPath = "ftp://ftp.hogehoge.hog/usr/xxxxx/hoge";
 
 app.doShellScript("curl -T '"+localFilePath.replace(/\'/g, "'\\''")+"' -u "+ftpUser+":"+ftpPassWord+" '"+upPath.replace(/\'/g, "'\''")+"'");

ローカルファイルやアップロードパスに絶対にスペースやクォーテーションマーク(ダブル、シングルとも)が含まれない自信があるなら、パスをクォーテーションで囲んだり、エスケープせずに以下のように書くこともできる。

 app.doShellScript("curl -T "+localFilePath+" -u "+ftpUser+":"+ftpPassWord+" "+upPath);

いずれにしても、これでは FTP パスワードがスクリプト内にむき出しになってしまうので、スクリプト実行時にキーチェーンからパスワードを取り出すことにする。


前提としてキーチェーンにすでにサーバーとユーザーとパスワードが登録されていることが必要である。

 app = Application.currentApplication();
 app.includeStandardAdditions = true;
 var ftpServerName = "ftp.hogehoge.hog"; //---"ftp://"をつける必要なし。
 var ftpUser = "xxxxx";
 
 var localFilePath = "/Users/xxxxx/foo/bar.txt";
 var ftpPassWord = keyChain(ftpServerName); //---キーチェーンからパスワードを取り出す。
 var upPath = "ftp://ftp.hogehoge.hog/usr/xxxxx/hoge";
 
 app.doShellScript("curl -T '"+localFilePath.replace(/\'/g, "'\\''")+"' -u "+ftpUser+":"+ftpPassWord+" '"+upPath.replace(/\'/g, "'\''")+"'");
 
 function keyChain(ftpServerName) {
   var keyChainString = app.doShellScript("security find-internet-password -g -r 'ftp ' -s "+ftpServerName+" 2>&1");
   var ftpPassWord = keyChainString.split("\"")[1];
   return ftpPassWord;
 }

function keyChain() 内で行なっているのは

security find-internet-password -g -r 'ftp ' -s server.hoge.hog 2>&1

を実行して得られる長い文字列から、ダブルクォーテーションマークで挟まれた文字列を抜き出すことだけである。

もし security コマンドの仕様が変わり、出力される文字列も違うものになったら、その際はこのスクリプトも修正する必要があるかもしれない。もっとも、Apple Script 時代から同様の処理を10年以上行なっているが変化していないので、今後も大丈夫だろうとは思う。

なお、セキュリティ上の問題をはらんでいるので、当記事を参考にスクリプトを作成する際は自己責任でお願いします。


« JavaScript for Automation (JXA)でUTF-8テキストの読み書き | トップページ

コメント

コメントを書く

(ウェブ上には掲載しません)

« JavaScript for Automation (JXA)でUTF-8テキストの読み書き | トップページ