はじめに
R上でshコマンドを実行する際に、しばしば、パスワードの受け渡し・認証の問題でエラーが起こる。
この認証をいい感じに補助してくれるコマンドが、sshpass
である。
今回、sshpass/ssh
、sshpass/scp
コマンドを組み合わせた事例を紹介する。
まずは、sshとscpコマンドのusageを見てみる。
ssh
は、ポート22でリモートコンピュータと通信するためのプロトコルである。
scp
は、ssh通信で、コンピュータ間でのファイルの転送・コピーを行うコマンドである。
#$ ssh #usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] # [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] # [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] # [-i identity_file] [-J [user@]host[:port]] [-L address] # [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] # [-Q query_option] [-R address] [-S ctl_path] [-W host:port] # [-w local_tun[:remote_tun]] destination [command] #$ scp #usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] # [-J destination] [-l limit] [-o ssh_option] [-P port] # [-S program] source ... target #-Crオプションでやや早くなる場合も
sshpassのインストール
どうもHomeBrew本家からは、 セキュリティ上の理由からsshpassのリポジトリ追加を 拒否られているとのこと*1。
なので、hudochenkovのGitHubサイトからインストールする。
##HomeBrew本家からはインストールできない #system("brew install sshpass") #Error: No similarly named formulae found. #Error: No available formula or cask with the name "sshpass". #We won't add sshpass because it makes it too easy for novice SSH users to #ruin SSH's security. #解決策 system("brew install hudochenkov/sshpass/sshpass") #OR #system("brew install https://raw.githubusercontent.com/hudochenkov/homebrew-sshpass/master/sshpass.rb") #パス確認 system("which sshpass") #/usr/local/bin/sshpass
sshpassのUsage
#Usage #system("sshpass") #Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters # -f filename Take password to use from file # -d number Use number as file descriptor for getting password # -p password Provide password as argument (security unwise) # -e Password is passed as env-var "SSHPASS" # With no parameters - password will be taken from stdin # -P prompt Which string should sshpass search for to detect a password prompt # -v Be verbose about what you're doing # -h Show help (this screen) # -V Print version information #At most one of -f, -d, -p or -e should be used
R上でSSHを実行するとバグるよ・・・
sshpass/sshコマンドを実行する場合の文法は以下の通りである。 ただ、これをRコンソールで実行するとバグってしまった。
system("sshpass -p [Your Password] ssh [Remote hostname]@[IP address / SSID]")
なので、良い子は、ターミナルタブに移動して実行しましょう。
sshpass -p [Your Password] ssh [Remote hostname]@[IP address / SSID]
R上でのSCP実行はうまくいく
sshpass/scpコマンドを実行する場合の文法は以下の通りである。
これは、うまく通った。ただ、Progress barが出ないのが残念。
system("sshpass -p [Your Password] scp [local machine file path] [Remote hostname]@[IP address / SSID]:[remote machine file path]")
ターミナルタブに移動して実行する場合には、
sshpass -p [Your Password] scp [local machine file path] [Remote hostname]@[IP address / SSID]:[remote machine file path]
ここで、[ ]の括弧は、語彙範囲を明示するもので、実際のコマンド実行時には不要である。
scpコマンドの具体例
scpコマンドの具体的な使い方を以下に示します。
#ローカルからサーバーに送る scp -P 22 -r [送るファイルパス] [ユーザー名]@XXX.jp:/AAA/BBB/ #秘密鍵を指定して、ローカルからサーバーに送る例 scp -P 22 -r -i [秘密鍵のファイルパス] [送るファイルパス] [ユーザー名]@XXX.jp:/AAA/BBB/ #サーバーからローカルに送る scp -P 22 -r [ユーザー名]@XXX.jp:/AAA/BBB [送り先のフォルダパス]
引数 | 概要 |
---|---|
-P 22 | ポート22を指定する |
-r | ディレクトリごと再帰的にコピーする |
-p | コピー元のタイムスタンプやパーミッションを保持する |
-i | ssh接続に使用する鍵ファイルを指定する |
まとめ
セキュリティ問題で拒否られてるだけあって、簡単・シームレスでコマンド実行ができる。
参考資料
*1:そらそうだろね