Ký tự đặc biệt '#' trong lệnh Perl SSH


7

Tôi cố gắng gửi lệnh bằng SSH trong tập lệnh perl của mình với # nhưng nó bị cắt ngắn ngay tại #

Thí dụ:

Văn bản đầu vào là:

$message = "Product ID # STK000134"

Lệnh SSH là:

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

Những gì đi qua là:

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

Thay vì :

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

Làm cách nào để đảm bảo rằng # và tất cả văn bản phía sau # sẽ vượt qua?

Câu trả lời:


10

#bắt đầu một bình luận trong vỏ. Thêm dấu ngoặc kép:

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

2

Các backticks gọi một vỏ. Vỏ xử lý #và mọi thứ sau khi nó là bình luận.

Bạn cần trích dẫn chính xác các giá trị được nội suy để shell không bị nhầm lẫn, bất kể chuỗi ký tự của bạn có chứa ký tự nào (ví dụ: dấu ngoặc đơn, dấu ngoặc kép, dấu gạch ngang, dấu thăng, dấu gạch chéo, dấu gạch chéo ngược, et cetera).

Bạn có thể sử dụng một phụ trợ như thế này:

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]}`;

Nếu bạn không quan tâm đến tất cả nhiễu ở giữa chuỗi lệnh của mình, thì bạn có thể sử dụng một số biến phụ:

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`;

Nhưng điều đó chỉ giải quyết vấn đề cho vỏ cục bộ . Bởi vì bạn đang sử dụng ssh , một shell trên hệ thống từ xa cũng sẽ diễn giải các chuỗi của bạn. Vì vậy, bạn thực sự cần phải trích dẫn chúng hai lần .

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`;

Thay thế cho việc sử dụng shell cục bộ (và phải trích dẫn cho nó), bạn có thể chạy lệnh cục bộ ( ssh ) trực tiếp bằng cách sử dụng mẫu đối số 4+ của open:

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

2

sử dụng Net :: OpenSSH và để nó thực hiện trích dẫn cho bạn:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.