web-dev-qa-db-ja.com

環境変数SSH_ASKPASSまたはaskpassをsudoersに設定し、resp

私はsshサーバーにログインして次のようなものを実行しようとしています:

ssh [email protected] 'Sudo echo "foobar"'

残念ながらエラーが発生しています:

Sudo: no tty present and no askpass program specified

グーグルは私に環境変数を設定するように言ったSSH_ASKPASSまたはaskpassファイルにsudoersを設定します。私のリモートマシンはDebian 6で実行されており、パッケージssh-askpassおよびssh-askpass-gnomeをインストールしましたが、sudoersファイルは次のようになります:

Defaults        env_reset
Defaults        askpass=/usr/bin/ssh-askpass

# User privilege specification
root    ALL=(ALL) ALL
user    ALL=(ALL) ALL

誰かが私が間違っていることとそれをよりよくする方法を教えてもらえますか?.

17
jan

このエラーメッセージを取り除く方法は2つあります。簡単な方法は、リモートのSudoプロセスに疑似端末を提供することです。オプション-tでこれを行うことができます:

ssh -t [email protected] 'Sudo echo "foobar"'
18
nosid

TTYを割り当てたり、コマンドラインに表示されるパスワードを設定したりするのではなく、次のようにします。

次のようにパスワードをエコーするシェルファイルを作成します。

#!/bin/bash

echo "mypassword"

次に、次のようにscpを使用して、必要なノードにそれをコピーします。

scp SudoPass.sh somesystem:~/bin

次に、sshを実行すると、次のようになります。

ssh somesystem "export Sudo_ASKPASS=~/bin/SudoPass.sh;Sudo -A command -parameter"
5
Michael

もう1つの方法は、Sudo -Sを実行して、「ターミナルデバイスを使用する代わりに、標準エラーにプロンプ​​トを書き込み、標準入力からパスワードを読み取る」(manによる)とcat

cat | ssh [email protected] 'Sudo -S echo "foobar"'

プロンプトが表示されたら、パスワードを入力するだけです。

1つの利点は、「[Sudo] password for…」が含まれていないリモートコマンドの出力をファイルにリダイレクトできることです。

cat | ssh [email protected] 'Sudo -S tar c --one-file-system /' > backup.tar
2
simon04

Defaults askpass=/usr/bin/ssh-askpass

ssh-askpassはXサーバーを必要とするので、(nosidで提案されているように、-t経由で)端末を提供する代わりに、-X経由でX接続を転送できます。

ssh -X [email protected] 'Sudo echo "foobar"'

ただし、現在のドキュメントによると、askpassPathではなくsudoersとしてSudo.confに設定されています。

1
Jan Hudec

2013年12月編集:短い回答です:1日か2日でPython library " Fabric "に慣れてください。ファブリックは、リモートタスクを1つ以上のサーバーにディスパッチする。

パスワードなしのコマンドを実行できるターゲットシステムでユーザー名を設定する必要があるでしょう(Fabricを使用してそれを実行することもできます!)。

Fabricの一部の側面が完全にPython的ではないことに注意してください。また、Fabricは、サーバーに対してコマンドをバッチ処理することを望むシステム管理者を念頭に置いて最初に設計されました。他に何かをしようとしている場合(非常に特定のサーバーやシナリオを自動化するなど)、「設定を使用する」や@rolesデコレーターがどのように機能するかを完全に理解する必要があります。振り返っていない...

(そして、はい、「リモート」システムで動作するリモートSSHコマンドを取得しました。つまり、サーバーAはサーバーBにサーバーCに接続するように要求し、コマンドの戻りはサーバーAに直接通信しませんが、サーバーC.ラボのセットアップが簡単になります!)。

元の応答:この問題には多くの解決策があります。コース用の馬;状況によっては、他のものより優れているものもあります。

質問されるのは、「TTYなし」エラーを解決する方法です。それが焦点のようですので、sudoersについての話はTTYの問題を回避するための回避策の単なる試みであると思います。

オプション1)Askhatの答えはうまくいきます...ほとんどの場合。実際には、常により多くのターゲットシステムで機能する「-tt」を指定します。

「-t」を実行する直感的な方法がないParamikoのようなSSHライブラリを使用している場合でも、問題が発生することに注意してください。

オプション2)私の答え-STDINであるASKPASSを指定することです。したがって、この例は、Sudoパスワード要件とTTYの両方を満たしています。$ Shell> ssh [email protected] 'echo "password" | Sudo -S echo "foobar"'

オプション3)はい、すべてまたは一部のユーザーのSudoパスワードチェックを無効にできますが、本番サーバーではそれはクールではありません。

オプション4)リモート "requiretty"(またはsudoersのすべてまたは一部のユーザーに "!requiretty"を設定できます。ここでも、プロダクションボックスではクールではありません。

サーバーの変更は行わないことをお勧めします。いつかそのサーバーが置き換えられ、設定がデフォルトに戻り、スクリプトが機能しなくなります。

すべてのオプションを理解すると、自動化への扉が開かれることに注意してください(たとえば、ラップトップ上のスクリプトでは、サーバーのホスト名のリストに接続できず、コピーする必要なしにこれらのサーバーでSudoタスクを実行できます)それらのサーバーへのスクリプト)。

1
Scott Prive