Специальный символ '#' в команде Perl SSH

Я думаю, что самый легкий путь состоял бы в том, чтобы сохранить контрольную сумму файла _my_file_ в файле _my_file_.md5 постарайтесь не хранить всю контрольную сумму в единственном файле. Таким образом, намного более просто знать, была ли контрольная сумма компьютером прежде.

Однако, если Вы только добавляете, файлы к Вашему флеш-накопителю (никогда не изменяют, возможно, удаляют, но никогда не добавляют файл, который когда-то существовал, прежде), Вы могли:

find _your_drive_path_ -type f |
  while read file; do
    grep -q $file _your_md5_file_ || md5sum $file >> _your_md5_file_
  done

Это grep Ваш файл контрольной суммы много раз и мог быть оптимизирован путем сортировки списка файлов и сохранения файла контрольной суммы отсортированным на имени файла, но если Вам не нужна эта оптимизация, почему, беспокоясь ее сложностью...

7
20.04.2013, 01:06
3 ответа

# запускает комментарий в оболочке. Добавьте кавычки:

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

Обратные галочки вызывают оболочку. Оболочка рассматривает # и все после него как комментарий.

Необходимо правильно заключить интерполированные значения в кавычки так, чтобы оболочка не “запутывалась”, какие символы строки, оказывается, содержат (например, одинарные кавычки, двойные кавычки, обратные галочки, знаки фунта, знаки доллара, обратные косые черты, и так далее).

Вы могли бы использовать помощника sub как это:

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;
2
27.01.2020, 20:15

используйте Net :: 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;
2
27.01.2020, 20:15

Теги

Похожие вопросы