2015-04-21 8 views
0

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

Это работает для меня, если машина назначения - это та же машина, на которой я запускаю скрипт (chmod $ perm $ path часть кода работает). Если я пытаюсь выполнить chmod-файлы на удаленном компьютере, это не сработает (ssh root @ "$ {destnode}" chmod $ perm $ path).

Есть еще одна проблема. Этот сценарий не может обрабатывать пробелы в именах файлов/папок. Может ли кто-нибудь помочь мне исправить это?

#!/bin/bash 
sourcenode=$1 
destnode=$2 
path1=/root/test 
tmp=/tmp/file-list 

ssh [email protected]"${sourcenode}" "find ${path1} -exec stat -c '%a %n' {} \; " > $tmp 
cat $tmp | ssh [email protected]"${destnode}" 'cat - > /tmp/file-list ' 
ssh [email protected]"${destnode}" cat $tmp | 
while read perm path 
do 
    #ssh [email protected]"${destnode}" chmod $perm $path 
    chmod $perm $path 
done 
+0

Ответ на «handl [in] пробелы» - это указать ваши переменные, когда вы их используете. Вы делаете это для '' $ {destnode} "' уже. Что происходит, когда вы запускаете команду 'ssh' команды? Вы получили сообщение об ошибке? –

+0

Трюк с кавычками работал над именами с пробелами :). Благодарю. Нет. Я не ошибаюсь. Похоже, переменные ($ perm и $ path) становятся пустыми, когда я пытаюсь передать их на удаленный компьютер. – fuzzy186

ответ

0

Проблема заключается в том, что вы пытаетесь запустить код bash непосредственно через ssh. Вам не нужно копировать список файлов в пункт назначения, так как у вас есть вся информация, которая вам нужна на хосте, на котором запущен скрипт.

Что касается вопроса имя_файла пространства я работал вокруг него с СЕПГ, заменяя пространство между разрешением и файл с «:», а затем установив соответствующий IFS (поле разделитель символов) в то время цикла:

#!/bin/bash 
sourcenode=$1 
destnode=$2 

path1=/root/test 
tmp=/tmp/file-list 

ssh [email protected]$sourcenode \ 
     "find $path1 -exec stat -c '%a %n' {} \; | sed -e 's/^\([0-9]*\) \(.*\)$/\1:\2/'" > $tmp 
while IFS=$':' read perm path; do 
    ssh [email protected]$destnode chmod $perm $path 
done < $tmp 
+0

Не работает olopopo. Тем не менее сценарий не может передать параметры удаленной машине. – fuzzy186

+0

':' является юридическим символом в именах файлов. Это делает его плохим выбором для разделителя. Вот почему GNU find имеет '-print0'. Вы абсолютно правы в том, что не отправляете файл в '$ {destnode}', хотя это совершенно бессмысленно и дорого. –

Смежные вопросы