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, 껍질외딴시스템은 문자열도 해석합니다. 따라서 실제로 인용해야합니다.두 배.

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;

관련 정보