5

私は自分の問題の解決策を求めてしばらくの間ネットを検索してきましたが、運がありません。

私の問題は、sudo コマンドを paramiko で実行できないように見えることです。

最初は、単純に SSHClient().exec_command(command) 関数を使用して sudo コマンドを実行しようとしましたが、次のエラーが発生しました。

sudo: sorry, you must have a tty to run sudo

次に、この投稿のアドバイスに従って: How to make a sudo command using Paramiko、私はこれを試しました:

#self._ssh is the SSHClient object    
self._ssh.invoke_shell().exec_command(command)

ただし、ほとんどの場合、これにより次のことがわかります。

File "pipelines/load_instance/ssh_tools.py", line 71, in executeCommand
    stdin, stdout, stderr = self._ssh.invoke_shell().exec_command(command)
  File "<absolute_path>/paramiko/channel.py", line 213, in exec_command
    self._wait_for_event()
  File "<absolute_path>/paramiko/channel.py", line 1084, in _wait_for_event
    raise e
paramiko.SSHException: Channel closed.

もう 1 つは、40% の確率で次のようになります。

File "<absolute_path>/paramiko/client.py", line 291, in connect
    sock.connect(addr)
File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

補足として、Amazon Web Services EC2 インスタンスでこれらの sudo コマンドを実行しようとしていますが、このコードを実行するたびに新しい実例...

また、paramiko 1.7.6 を使用しています。

4

2 に答える 2

3

これは、最近のディストリビューションでよく見られる問題であり、paramiko 以外にも影響を与えます。(先日、ボックスをfedora2から最新にアップグレードしたときに遭遇しました。いくつかのssh / sudo管理スクリプトが壊れていました)

リモートホストにアクセスできる限り、次/etc/sudoersの行を編集してコメントアウトできます。Defaults requiretty

sudoers のマニュアル ページの詳細:

必須

設定すると、ユーザーが実際の tty にログインしている場合にのみ sudo が実行されます。rsh(1) は tty を割り当てないので、これは "rsh somehost sudo ls" のようなものを禁止します。tty が存在しない場合はエコーをオフにすることはできないため、一部のサイトではこのフラグを設定して、ユーザーが目に見えるパスワードを入力できないようにする必要があります。このフラグはデフォルトでオフになっています。

于 2011-04-26T05:37:37.557 に答える
0
stdin, stdout, stderr = client.exec_command(cmd,  get_pty=True)
于 2017-04-10T13:03:18.070 に答える