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]に1回、「ssh」を2回入力する必要があります。
答え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"コマンドはループをブロックするため、目的の方法で機能しません。引き続き解決策を探してみましょう。