Pexpect, работая ssh-copy-id зависает при попытке породить второй процесс

input {
	padding-bottom: 100px;
	width: 500px;
}

input[type=text] {
	border: 2px solid darkgrey;
	border-radius: 10px;
<input type='text'/>

7
задан 6 revs 2 October 2010 в 20:47
поделиться

4 ответа

Я думаю, что проблема, что SSH пытается открыть PTY, и она не работает ни над чем больше, чем ИМУЩЕСТВО из соображений безопасности. Это не будет работать хорошо с pexpect.

У меня есть другой ssh клиент:

http://www.digmia.com/index.php?option=com_content&view=article&id=54:Digmia%20Enterprise%20SSH&Itemid=56

Это - открытый исходный код, можно использовать его. То, что Вы пытаетесь сделать, было бы большим количеством команд, но Вы не должны ожидать вообще.

  1. Сначала установите его соответственно на руководстве, затем сделайте что-то вроде этого:

  2. Выполненный dssh-агент, добавляет пароль, в котором Вы нуждаетесь как это:

    dssh-add -l < passwordfile
    
    • или если бы это - безопасная машина, т.е. никто больше не может зарегистрироваться там, это очень важно, иначе это было бы огромной дырой в системе безопасности:

      echo "name-of-server;22;root;password;" | dssh-add -l
      
    • password файл был бы чем-то как:

      name-of-server;22;root;password;
      
  3. И чего-то как (замена CONTENTS OF ... с фактическим содержанием того файла):

    dssh root@name-of-server -- echo "CONTENTS OF ~/.ssh/identity.pub" > .ssh/authorized_keys \; chmod og-w .ssh .ssh/authorized_keys
    
    • Можно (дополнительно) сделать

      dssh-add -f passwords
      

    (удостоверьтесь, что никто больше не делает весь этот материал, иначе у Вас было бы состояние состязания).

Кроме того, pexpect должен, вероятно, работать с самим dssh (таким образом, Вы не должны использовать dssh-агент). Но использование dssh-агента более просто и более безопасно.

Руководство по установке для DSSH содержится в tarball.

Я не знаю более простого способа сделать это, OpenSSH ssh-copy-id очень требователен в отношении того, куда пароль прибывает из...

1
ответ дан 7 December 2019 в 14:39
поделиться

Читая pexpect документацию для икры, я думаю, что она ожидает команды для завершения.

Я предложил бы несколько различных возможностей, в зависимости от Ваших потребностей:

1) Уничтожьте порожденный процесс. Однако это может привести к повреждению в Вашей операции, таким образом, я не знаю, является ли это тем, что Вы хотите.

child = pexpect.spawn('command')
child.expect('password:')
child.sendline('the password')
child.close(True)

2) Ожидайте завершения начальной задачи прежде, чем переместиться в следующую

child = pexpect.spawn('command')
child.expect('password:')
child.sendline('the password')
child.wait()
child = pexpect.spawn('command2')
...

3) Используйте другой экземпляр для всех детей, затем ожидайте на всех них в конце - и это было бы по всей вероятности лучшим решением

def exec_command(cmd):
  child = pexpect.spawn(cmd)
  child.expect('password:')
  child.sendline('the password')
  return child

commands = ['command1', 'command2']
childrens = [exec_command(cmd) for cmd in commands]
for child in childrens:
  child.wait()    

Примечание: весь код здесь не протестирован и написан под предположением, что Ваш сценарий зависает, потому что удаление объекта икры зависнет, пока команда не завершится.

0
ответ дан 7 December 2019 в 14:39
поделиться

На самом деле я попробовал многие из этих альтернатив, и ни один не работал.

  • Вызов близко () или оконечный () зависает (оба с Истиной и ложью как параметры)
  • Вызов ожидает () или считал (-1) или ожидает (pexpect. EOF), зависает
  • вызов икры снова, не заботясь о предыдущей команде икры зависает

Я сделал некоторые тесты с другими командами (как 'ftp', и они работают, как я ожидал бы, например, если Вы называете .expect ('что-то'), и что-то не найдено перед EOF они не ожидают навсегда, они выдают исключение, таким образом, я полагаю, что это связано с командой ssh-copy-id конкретно.

0
ответ дан 7 December 2019 в 14:39
поделиться

К счастью или нет, но клиент OpenSSH кажется очень разборчивым в отношении паролей и их происхождения.

Вы можете попробовать использовать библиотеку Paramiko Python SSH2. Вот простой пример того, как использовать его с аутентификацией по паролю , а затем ввести несколько команд оболочки ( echo "..." >> $ HOME / .ssh / authorized_keys является самым простым), чтобы добавьте свой открытый ключ на удаленный хост.

3
ответ дан 7 December 2019 в 14:39
поделиться
Другие вопросы по тегам:

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