PowerPC Linux의 소형 가상 머신을 부팅하는 소형 장치가 있고 Yocto Linux 소형 버전의 스크립트를 통해 SSH를 통해 가상 머신에 액세스해야 합니다. PowerPC VM SSH 비밀번호는 동일하게 유지되지만 재설정됩니다.최대핵심 파일에는 재부팅할 때마다 SSH 키 재생성이 포함됩니다.
Yocto Linux 설치에는 "expect" 명령이 없으며 "sshpass"를 설치할 수 없습니다. Python 버전은 매우 제한적입니다.
쉘 스크립트만 사용하여 기본 "ssh" 프롬프트에서 비밀번호 요구 사항을 완료할 수 있기를 원합니다. 가능합니까?
답변1
SSH를 통해 로그인할 때 원격으로 비밀번호를 보내는 스크립트를 원한다고 가정해 보겠습니다. 여기에 추가 라이브러리 등이 필요하지 않은 아주 작은 Python 코드가 있습니다. 분명히 이것은 os forkpty execlp read write를 사용하여 달성할 수 있는 작업의 예일 뿐입니다.
#!/usr/bin/python
# simplest builtin python pseudo-tty for ssh password. meuh
# http://unix.stackexchange.com/a/276385/119298
import os
def run(cmd,*args):
pid, fd = os.forkpty()
if pid==0: # child
os.execlp(cmd,*args)
while True:
data = os.read(fd,1024)
print data
if "password:" in data: # ssh prompt
os.write(fd,"mypassword\n")
elif data.endswith("$ "): # bash prompt for input
os.write(fd,"echo hello\n")
os.write(fd,"echo bye\n")
os.write(fd,"exit\n")
run("ssh", "ssh", "user@remote")
argv[0]에 한 번, "ssh"를 두 번 입력해야 합니다.
답변2
안녕하세요, 팁을 주셔서 감사합니다! 다른 장치에 명령을 보내기 위해 루프를 만들고 코드를 사용자 정의해야 합니다.
#!/usr/bin/python
# simplest builtin python pseudo-tty for ssh password. meuh
# http://unix.stackexchange.com/a/276385/119298
import os
import subprocess
import getpass
addresses = open('IP_addresses.txt', 'r')
lines = addresses.readlines()
update_log = open('Update_Log.txt', 'w')
update_log.close()
password = getpass.getpass(prompt='Password: ', stream=None)
def ssh_connect():
global count
count = 0
for line in lines:
count += 1
print line.strip()
x = line.strip()
x = x.split(',')
def run(cmd,*args):
pid, fd = os.forkpty()
if pid==0: # child
os.execlp(cmd,*args)
while True:
data = os.read(fd,1024)
print data
if "Password:" in data: # ssh prompt
os.write(fd,password)
os.write(fd,"\n")
elif data.endswith("#"): # bash prompt for input
os.write(fd,"terminal l 0\n")
os.write(fd,"show version\n")
os.write(fd,"exit\n")
if "closed." in data: # connection closed for input
break
run("ssh", "ssh", '%s@%s' %(x[0], x[1]))
if not line:
break
print("Line{}: {}".format(count, line.strip()))
addresses.close()
print ssh_connect()
"exit" 명령이 루프를 차단하기 때문에 원하는 방식으로 작동하지 않습니다. 계속해서 해결책을 찾아보겠습니다.