Мне нужно в python выполнить эту команду и ввести пароль с клавиатуры, это работает:
import os
cmd = "cat /home/user1/.ssh/id_rsa.pub | ssh [email protected] \'cat >> .ssh/authorized_keys\' > /dev/null 2>&1"
os.system(cmd)
Как видите, я хочу добавить открытый ключ к удаленному хосту через ssh.
См. здесь: эквивалент-of-ftp-put-and-append-in-scp и здесь: копировать-и-добавить-файлы-на-удаленный-machine-cat-error
Конечно, я хочу, чтобы он делал это без пользовательского ввода. Я пробовал pexpect, и я думаю, что команда для него слишком странная:
import pexpect
child = pexpect.spawn(command=cmd, timeout=10, logfile=open('debug.txt', 'a+'))
matched = child.expect(['Password:', pexpect.EOF, pexpect.TIMEOUT])
if matched == 0:
child.sendline(passwd)
в отладке.txt:
ssh-rsa AAAA..........vcxv233x5v3543sfsfvsv user1@host1
/bin/cat: |: No such file or directory
/bin/cat: ssh: No such file or directory
/bin/cat: [email protected]: No such file or directory
/bin/cat: cat >> .ssh/authorized_keys: No such file or directory
/bin/cat: >: No such file or directory
/bin/cat: 2>&1: No such file or directory
Я вижу два решения:
- исправьте команду для pexpect, чтобы она распознавала всю строку как одну команду или,
- ввести/записать пароль на стандартный ввод под фальшивым пользователем, но как!?!?
"_'|'_"
- person jfs   schedule 24.10.2015ssh-copy-id
вместо этого? - person jfs   schedule 24.10.2015ssh-copy-id
— это просто сценарий оболочки. Если у вас установлен клиент openssh (командаssh
), то он должен быть доступен. - person jfs   schedule 26.10.2015