pythonインタラクティブシェルとopensshをローカルで実行していると、paramikoを使用して「既存のセッションがありません」という例外が発生し続けます。コードは次のとおりです。
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username=name,password=pw)
結果:
No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/paramiko-1.7.7.1-py2.6.Egg/paramiko/client.py", line 332, in connect
self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
File "/usr/local/lib/python2.6/dist-packages/paramiko-1.7.7.1-py2.6.Egg/paramiko/client.py", line 493, in _auth
raise saved_exception
paramiko.SSHException: No existing session
以前は接続できましたが、キーベースの認証を可能にするためにこれを調整しようとしていました。それは失敗し、それ以来、私はローカルに接続することができませんでした。 opensshを再起動しようとしましたが、別のサーバーに正常に接続しました。ここを検索した後、私が見つけたのは承認の例外についての言及だけですが、ここではそうではないようです。
すでにパスワードを持っているので、エージェントと話したり、マシンに保存されている秘密鍵を探す必要はありません。したがって、追加のパラメータを渡してみてくださいallow_agent
、look_for_keys
:
ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)
Ssh-addリストにキーパスフレーズを含む予備の公開鍵がありました。削除すると、paramikoベースのスクリプトを適切に実行できました。
リストするには:
ssh-add -l
すべてを削除するには:
ssh-add -D
再追加するには:
ssh-add /FULL/PATH/TO/id_rsa
https://bugs.launchpad.net/paramiko/+bug/91212
どのOSを使用していますか?多分あなたはあなたの環境変数をチェックすることができます:SSH_AUTH_SOCK
「接続」の場合、sshエージェントを使用しようとします。 agent.pyで
self.conn = None
self.keys = ()
if ('SSH_AUTH_SOCK' in os.environ) and (sys.platform != 'win32'):
conn = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
conn.connect(os.environ['SSH_AUTH_SOCK'])
except:
# probably a dangling env var: the ssh agent is gone
return
self.conn = conn
Elif sys.platform == 'win32':
import win_pageant
if win_pageant.can_talk_to_agent():
self.conn = win_pageant.PageantConnection()
else:
return
クリーンなDockerコンテナーにあるため、同じエラーERROR:SSHException('No existing session',)
bunが発生し、sshエージェントがありませんでした。
数時間のデバッグの後、別の解決策を見つけました。鍵交換中にタイムアウトが発生した場合に発生する可能性があります。私の場合、sshサーバーはGSMリンクを介したルーターであり、非常に遅いです。
次の方法でparamikoのデバッグを有効にできます。
logging.getLogger("paramiko").setLevel(logging.DEBUG)
また、Connected
とSwitch to new keys ...
の間に例外が表示された場合は、鍵交換中にタイムアウトが発生したことを意味します。この場合、timeoutをより大きな値に設定する必要があります! (ドキュメントによるとtimeoutはTCP接続のみですが、実際には認証前のネゴシエーション全体にも使用されます!)