@kyanny's blog

My life. Opinions are my own.

String::ShellQuote でコマンドラインをクォートしてリモートで実行する

追記

コメント欄で指摘されているように、 Net::SSH::Perl モジュールを利用したほうが無用なことで困らずに済みそうです。

use String::ShellQuote;

my $command = q[gunzip -c /path/to/access_log.gz | perl -e 'while(<>){print}'];
my $quoted_command = shell_quote($command); # ' => '\'' とクォートされる
qx/ssh $server $quoted_command/;

しかしこれが何度やっても失敗するサーバがあり、エラーメッセージ Badly placed ()'s. でぐぐってみると csh/tcsh に特有のものらしく、確かに該当サーバのログインシェルは csh だった。 \(\) などとしなくてはならないらしい。が String::ShellQuote は Bourne Shell のクォートにしか対応していない。 csh め・・・。困った・・・。