Аргументы ssh в цикле - PullRequest
       29

Аргументы ssh в цикле

0 голосов
/ 07 июля 2010

Я пытаюсь передать данные для входа на разные машины через ssh в сценарии оболочки.Несмотря на то, что я использовал цикл for, я заканчиваю тем, что посылаю всю информацию для входа на все машины.Может кто-нибудь помочь мне с этим?

    for system in ${allSystems}
    do
        machine=`echo $system | awk -F ";" '{print $1}'`
        username=`echo $system | awk -F ";" '{print $2}'`
        password=`echo $system | awk -F ";" '{print $3}'`

        echo "$machine;$username;$password" | ssh $machine 'cat >> loginDetails.txt'    
    done

Пример системы $ будет содержать:

abcde.unix.system.edu;username;password

Спасибо.

Ответы [ 4 ]

2 голосов
/ 07 июля 2010

Будет ли для вас более целесообразно настроить ssh authorised_keys на удаленном сервере? Таким образом, ваши сценарии вообще не должны будут вводить пароль.

Предполагается, что ваша удаленная машина называется remote_machine:

На вашем локальном компьютере:

scp ~/.ssh/id_rsa.pub remote_machine:~/.ssh/source.pub

Эти шаги выполняются на удаленной машине:

ssh remote_machine
cd .ssh
if [ -e "authorized_keys" ]; then 
    cat source.pub >> authorized_keys 
else 
    mv source.pub authorized_keys
fi

Если вы застряли, следуйте инструкциям в этом HOWTO .

Убедитесь, что вы понимаете, что делаете, прежде чем запускать какой-либо код на любых рабочих машинах. Это позволит любому, кто входит в ваш ящик, получить доступ к remote_machine.

0 голосов
/ 08 июля 2010

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

Отладка, исключив ssh из вопроса. Замените строку, начинающуюся с 'echo', следующим образом:

  echo "$system => machine:$machine username:$username password:$password"

и убедитесь, что каждая из переменных $ system, $ machine, $ username и $ password соответствует ожиданиям.

Кстати, более эффективным способом написания этого может быть использование awk, или sed, или даже tr (в зависимости от формата вашего списка систем) для извлечения трех полей, а затем использование оболочки при цикл чтения для их итерации, что позволяет избежать трех вызовов awk для каждого хоста, к которому осуществляется доступ. Например, если «$ allsystems» содержит

  mach1;user1;pass1 mach2;user2;pass2 mach3;user3;pass3

без посторонних полей или другой нежелательной информации, вы можете использовать это:

  echo "$allsystems" | tr '; ' '\t\n' | while read mach user pass
  do
      echo ...
  done
0 голосов
/ 07 июля 2010

Да, пара открытых / закрытых ключей - хороший ответ на вашу проблему.

http://novosial.org/openssh/publickey-auth/

0 голосов
/ 07 июля 2010

Но если вы не хотите делать это таким образом, попробуйте написать сценарий ожидания

http://en.wikipedia.org/wiki/Expect

...