2012-04-19 5 views
15

私はSSHサーバにログインしようとしているとのようなものを実行するために:セット環境sudoersファイル内の変数SSH_ASKPASSまたはaskpassパッケージ、RESP

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

を残念ながら、私はエラーを取得しています:

sudo: no tty present and no askpass program specified 

Googleは、ファイルに環境変数SSH_ASKPASSを設定するか、askpassを設定するように指示しました。私のリモートマシンが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 

誰かが私が何を言うことができます間違ってやり直す方法。

答えて

18

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

ssh -t [email protected] 'sudo echo "foobar"' 
+6

...と難しい方法:

一つの利点は、あなたがそれで「の... [須藤]パスワード」のないファイルへのリモートコマンドの出力をリダイレクトすることができるということですか? –

+1

@ bradley.ayers:問題は 'sudo'がttyからパスワードを読みたいということです。あなたがsudoのためのttyを提供するか、sudoのパスワードチェックを避けるかのどちらかです。後者は、セキュリティを確保したい場合にはより困難です。 – nosid

+0

@nosidありがとう。 –

-3

方法sudoersファイルでこれを追加することについて:

user ALL=(ALL) NOPASSWD: ALL 
+3

これはあまり安全ではありません。 –

+1

私は同意しますが、あなたの管理下にあるサーバにのみ推奨します – Akshat

+3

sudoのパスワード要件を削除するのは悪いです。 "ALL"実行可能ファイルにパスワードを指定しないと、さらに悪化します。サーバーがあなたのコントロールにあるため、あなたがOKと考えるべきものではありません。サーバー上にまったく変更を加える必要のないより安全な選択肢があります。 –

1

EDIT 2013年12月: ここでは短い答えはあります:1日乗りまたは2に慣れるためにPythonライブラリ "Fabric"を使用してください。ファブリックは、リモートタスクを1台以上のサーバーにディスパッチする際に、大量の問題を解決します。

パスワードレスコマンドを実行できるターゲットシステムでユーザ名を設定したいと思うかもしれません(また、Fabricを使用してそれを行うこともできます)。

Fabricのいくつかの側面は完璧にPythonicではありません。また、ファブリックは、まずシステム管理者を念頭に置いて設計されており、サーバーに対してコマンドをバッチ処理したい人もいます。非常に特殊なサーバーやシナリオを自動化するなど、何か他のことをしようとしているなら、 "設定"や@rolesデコレータがどのように機能するかを完全に理解したいでしょう。私は戻って見ていない...

(そして、私はリモートシステムで働いているリモートSSHコマンドを持っている、つまり、サーバーAはサーバーBにサーバーCに接続するように要求し、コマンドの戻り値はAはサーバーCと直接通信しませんが、サーバーAには表示されます)。

元の応答: この問題の解決方法は多数あります。コースの馬;異なる状況では他のものより優れているものもあります。

"いいえTTY"エラーを解決する方法は、質問されました。これは焦点になっているようですので、sudoersに関する話はTTYの問題を回避するための回避策に過ぎないと思います。

オプション1)Askhatの答えは素晴らしい...ほとんどの時間。実際には、より多くのターゲットシステムで動作する "-tt"を常に指定してください。

ParamikoのようなSSHライブラリを使用している場合でも、「-t」を直感的に実行する方法はありません。

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

オプション3)すべてのユーザーまたは一部のユーザーのパスワードを確認しますが、これは運用サーバーでは問題になりません。

オプション4)あなたは、リモート「requiretty」(または設定することができ、全てまたはsudoersファイルで一部のユーザーのための「!requiretty」。もう一度、生産ボックスにクールではない。

これは、サーバーの変更を避けるのがベストです。いつかそのサーバーは置き換えられ、設定はデフォルトに戻り、スクリプトは機能しなくなります。

すべてのオプションを理解すると、より多くの自動化の扉が開きます(たとえば、ラップトップはサーバーのホスト名のリストに接続して、それらのサーバー上でそれらのサーバーにsudoタスクを実行することができます)。

5

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

のようなパスワードをのをエコーシェルファイルを作成します。そのノードに、あなたがこのようなscpを使用したいとコピー

#!/bin/bash 

echo "mypassword" 

を:

scp SudoPass.sh somesystem:~/bin 

その後、あなたは次の操作を行うsshとき:

ssh somesystem "export SUDO_ASKPASS=~/bin/SudoPass.sh;sudo -A command -parameter" 
+0

'export SUDO_ASKPASS = 'echo" mypassword "'; sudo whatever_command'?私は自分でそれを試していないが、私はそれが動作するはずだと思う... – anishsane

+0

これは私のために動作しません。私はまだ取得します: '$ SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "echo hello" '次の出力:' sudo:指定されたaskpassプログラムがありません、SUDO_ASKPASSを設定しよう ' –

+0

@white_gecko:環境変数をエクスポートしていないためです。試してみてください: 'SUDO_ASKPASS = $ HOME/askpass.shをエクスポートしてください。 sudo -A "/ bin/true" ' – miklosq

2

もう1つの方法は実行する一緒にcatと(manによれば)「標準誤差にプロンプ​​トを書く代わりに、端末装置を使用して、標準入力からパスワードを読み取る」ために、:

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

だけ入力プロンプトが表示されたパスワードに。

cat | ssh [email protected] 'sudo -S tar c --one-file-system /' > backup.tar 
+0

これは私をもっと近づけました....(実際にはパスワードの入力が求められましたが)入力は何もしませんでした。代わりに、私は 'usernameのためにsudoのパスワードを持っています:残念です、もう一度やり直してください。 '自動的に3回表示されて終了します。 –