SSH Создать каталог на удаленном сайте, используя Perl Script - PullRequest
0 голосов
/ 21 декабря 2018

Ранее я задавал вопрос о том, как определить, является ли путь каталогом или нет на удаленном сайте с использованием SSH.Я хочу создать каталог, если путь не является каталогом.Я попробовал следующий код двумя способами, но, похоже, он не работает.Спасибо всем, кто здесь помогает.

use File::Path;

my $destination_path = "<path>";
my $ssh = "usr/bin/ssh";
my $user_id = getpwuid( $< );
my $site = "<site_name>";
my $host = "rsync.$site.com";

if (system("$ssh $user_id\@$host [ -d $destination_path ]") == 0) {
    print "It is a directory.\n";   

} else {
    print "It is not a directory.\n";

    #First Way
    if(system("$ssh $user_id\@$host [ make_path ($d_path_full) ]") == 0{

    #Second Way
    if(system("$ssh $user_id\@$host [ mkdir -p $d_path_full ]") == 0{
       print "Create directory successfully.\n";

    } else {
       print "Create directory fail.\n";
    }
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я бы порекомендовал использовать соответствующий модуль для работы с SSH, а именно Net :: OpenSSH , SSH-клиент, построенный на OpenSSH.

Хотя он реализован на чистом Perl, он быстр и стабилен и не имеет обязательной зависимости (кроме, конечно, двоичных файлов OpenSSH). Как объяснено в документации , при определенных условиях он автоматически заключает в кавычки любые метасимволы оболочки в списках команд.

Следующие коды демонстрируют, как он может реагировать на ваш вариант использования.Он использует тот же ярлык, объясненный @zdim, используя mkdir -p:

  • , если каталог не существует, он создается (если это не удается, возникает ошибка)
  • если он уже существует, ничего не происходит
  • , если существует файл с целевым именем, возникает ошибка

Код:

use warnings;
use strict;
use Net::OpenSSH;

my $host = ...;
my $user_id = ...;
my $destination_path = ...;

# connect
my $ssh = Net::OpenSSH->new($host, user => $user_id);
$ssh->error and die "Can't ssh to $host: " . $ssh->error;

# try to create the directory
if ( $ssh->system('mkdir', '-p', $destination_path) ) {
    print "dir created !\n";
} else {
   print "can't mkdir $dir on $host : " . $ssh->error . "\n";
}

# disconnect
undef $ssh;
0 голосов
/ 21 декабря 2018

Скобки (скобки), одиночные [ или пара [ ], являются встроенными в bash, который является оператором проверки (см. man test), и его последнее использование неверно.Но вам не нужно создавать каталог

use warnings;
use strict;
use feature 'say';

my $ssh = '/usr/bin/ssh';

my $user_id = ...
my $host    = ...

my $to = quotemeta $user_id.'@'.$host;

my $cmd = 'mkdir -p TEST_MKDIR_OVER_SSH';

system("$ssh $to $cmd") == 0  or die "Can't mkdir: $!";

mkdir тихо работает с -p, если каталог уже существует, и возвращает успех, что также не соответствует цели [ ] (если это было намерение).Но фактическая ошибка - файл с таким именем существует, без прав доступа к пути и т. Д. - возвращается к сценарию, как вам нужно, и к строке с сообщением об ошибке.находится в $!, поэтому, пожалуйста, проверьте это.

Если вы просто хотите узнать, существует ли каталог, пожалуйста, верните вашу тестовую ветку или просто пропустите -p и проанализируйте $!, что это за сообщениенаходится в вашей системе.

Что касается второй попытки: команда, которая будет выполнена, выполняется на удаленной системе и больше не имеет ничего общего с этим сценарием (кроме интерполированных переменных).Поэтому функции или библиотеки Perl из этого скрипта не имеют смысла в этой команде.

Для следующего шага я предлагаю изучить модули для (подготовки и) запуска внешних команд, которые гораздо более полезны, чем голые system.

Некоторые, от простых до более способных: IPC :: System :: Simple , Capture :: Tiny , IPC :: Run3 , IPC :: Run .Также см. String :: ShellQuote , чтобы подготовить команды и избежать проблем с цитированием, ошибок внедрения оболочки и других проблем.Недавний пост содержит примеры этого;искать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...