Perl SSH コマンドの特殊文字 '#'

Perl SSH コマンドの特殊文字 '#'

Perl スクリプトで # を使用して SSH でコマンドを送信しようとしましたが、# で切り捨てられてしまいます

例:

入力テキストは次のとおりです:

$message = "Product ID # STK000134"

SSHコマンドは次のとおりです:

$execute=`ssh -q id@host /usr/message/send -pin $pager_num -message $message`;

通過するものは次のとおりです:

ssh -q id@host /usr/message/send -pin $pager_num -message Product ID 

の代わりに :

ssh -q id@host /usr/message/send -pin $pager_num -message Product ID # STK000134

# と # の後ろにあるすべてのテキストが確実に通過するようにするにはどうすればよいですか?

答え1

#シェル内でコメントを開始します。引用符を追加します。

$message =~ s/\#/\\\#/g;
$execute=`ssh -q id@host /usr/message/send -pin $pager_num -message "'$message'"`;

答え2

バックティックはシェルを呼び出します。シェルはバックティック#とその後のすべてをコメントとして扱います。

文字列にどのような文字が含まれていても (一重引用符、二重引用符、バックティック、ポンド記号、ドル記号、バックスラッシュなど)、シェルが「混乱」しないように、補間された値を適切に引用符で囲む必要があります。

次のようなヘルパーサブを使用できます。

sub sq ($) {
    # Bourne-style single quote $_[0]
    # e.g.
    #    foo bar    becomes    'foo bar'
    #    a'b        becomes    'a'\''b'

    # The following implementation does not yield the most compact
    # representations, but it is dead simple.
    my $sq = $_[0];
    $sq =~ s/'/'\\''/g;
    "'$sq'";
}
$execute=`ssh -q id@host /usr/message/send -pin @{[sq $pager_num]} -message @{[sq $message]}`;

コマンド文字列の途中にあるノイズを気にしない場合は、いくつかの追加変数を使用できます。

my $sq_pager_num = sq $pager_num;
my $sq_message = sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $sq_pager_num -message $sq_message`;

しかし、それは問題を解決するだけであり、地元シェルを使用しているためssh、貝殻のリモートシステムも文字列を解釈します。そのため、実際には引用符で囲む必要があります。2回

my $tsq_pager_num = sq sq $pager_num;
my $tsq_message = sq sq $message;
$execute=`ssh -q id@host /usr/message/send -pin $tsq_pager_num -message $tsq_message`;

ローカルシェルを使用する代わりに(そしてそれを引用符で囲む代わりに)、ローカルコマンド(ssh) は、 の 4 つ以上の引数形式を使用して直接計算できますopen

open CMD, '-|', qw(ssh -q id@host /usr/message/send -pin), sq $pager_num, '-message', sq $message;
{ local $/; $execute = <CMD>; }
close CMD;

答え3

使用ネット::OpenSSH引用文の作成は次のように行います。

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new('id@host');
my $output = $ssh->capture("/usr/message/send",
                           -pin => $pager_num,
                           -message => $message);
$ssh->error and die "ssh failed: " . $ssh->error;

関連情報