京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Mac版sshpassを使って、SSH/SCPコマンドのパスワード認証を引数で与えてみた件

はじめに

R上でshコマンドを実行する際に、しばしば、パスワードの受け渡し・認証の問題でエラーが起こる。

この認証をいい感じに補助してくれるコマンドが、sshpassである。

今回、sshpass/sshsshpass/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接続に使用する鍵ファイルを指定する

まとめ

セキュリティ問題で拒否られてるだけあって、簡単・シームレスでコマンド実行ができる。

参考資料

webkaru.net

qiita.com

techtipshoge.blogspot.com

*1:そらそうだろね