input {
padding-bottom: 100px;
width: 500px;
}
input[type=text] {
border: 2px solid darkgrey;
border-radius: 10px;
<input type='text'/>
Я думаю, что проблема, что SSH пытается открыть PTY, и она не работает ни над чем больше, чем ИМУЩЕСТВО из соображений безопасности. Это не будет работать хорошо с pexpect.
У меня есть другой ssh клиент:
Это - открытый исходный код, можно использовать его. То, что Вы пытаетесь сделать, было бы большим количеством команд, но Вы не должны ожидать вообще.
Сначала установите его соответственно на руководстве, затем сделайте что-то вроде этого:
Выполненный dssh-агент, добавляет пароль, в котором Вы нуждаетесь как это:
dssh-add -l < passwordfile
или если бы это - безопасная машина, т.е. никто больше не может зарегистрироваться там, это очень важно, иначе это было бы огромной дырой в системе безопасности:
echo "name-of-server;22;root;password;" | dssh-add -l
password
файл был бы чем-то как:
name-of-server;22;root;password;
И чего-то как (замена 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 очень требователен в отношении того, куда пароль прибывает из...
Читая 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()
Примечание: весь код здесь не протестирован и написан под предположением, что Ваш сценарий зависает, потому что удаление объекта икры зависнет, пока команда не завершится.
На самом деле я попробовал многие из этих альтернатив, и ни один не работал.
Я сделал некоторые тесты с другими командами (как 'ftp', и они работают, как я ожидал бы, например, если Вы называете .expect ('что-то'), и что-то не найдено перед EOF они не ожидают навсегда, они выдают исключение, таким образом, я полагаю, что это связано с командой ssh-copy-id конкретно.
К счастью или нет, но клиент OpenSSH кажется очень разборчивым в отношении паролей и их происхождения.
Вы можете попробовать использовать библиотеку Paramiko Python SSH2. Вот простой пример того, как использовать его с аутентификацией по паролю , а затем ввести несколько команд оболочки ( echo "..." >> $ HOME / .ssh / authorized_keys
является самым простым), чтобы добавьте свой открытый ключ на удаленный хост.