SSH:sudoコマンドを実行


44

インタラクティブなシェルスクリプトがあり、ある場所で別のマシン(Ubuntuベース)にsshし、rootとして何かを実行する必要があります(ユーザーはパスワードを入力する必要がありますが、リモートコマンドはスクリプトに記載されているように実行する必要があります):

# ...
ssh remote-machine 'sudo ls'
# ...

ただし、このエラーメッセージは常に返されます。

sudo: no tty present and no askpass program specified

わかりました。しかし、どうすればこれを回避できますか?このようなことが起こるはずです:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

回答:


52

不思議な人sshはすべての治療法を持っています。ポイントは、-tsshに擬似ttyを割り当てるようにフラグを追加することです:

ssh -t remote-server 'sudo ls'

1
ただし、PTYはスクリプトを台無しにする可能性があります。ls出力には、たとえば\ r \ nの末尾が含まれます。
東武

1
それを回避する簡単な方法は、lsを強制的に非終端モードにすることです。ls | cat行う-stdoutがパイプであることがわかります。この特定の質問では、端末から対話的に実行することを意図しているため、これは関係ありません。したがって、おそらく列と色などが必要です。
ゲイブ

0

このメソッドは、sshの後にsudoを使用して単一のスクリプトを実行します。

sudo機能を持つ「リモート」ユーザーがいて、rootとして実行するスクリプトがあると仮定します。

1)ログインで使用するスクリプトを/ etc / passwdに設定します。

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2)「login.sh」内で、「sudo」として実行するスクリプトを実行します。

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

通常、パスワードを2回要求します:ssh login + sudo。一度だけ入力したい場合は、パスワードなしでsudoを試してください(推奨されません)。<-Boldewynのコメントをお読みください。

主な利点は、「ssh」が他のパラメータ(-tなど)を必要とせず、sudoがサーバー側で強制されることです。また、スクリプトが終了すると、ユーザーもログアウトされます。

エレガントではないかもしれませんが、シンプルで機能します。


ええとああ。sudoersこのようなサーバー上のファイルにリモートユーザーを配置することは、起こるのを待っている大惨事です。ユーザーとして(たとえば、Webサーバーを介して)アクセスを取得したユーザーは、すぐにルートなります。ありがとう、しかし、私は私のサーバー構成を対立させない解決策を探していました。何らかの方法でsudoコマンドにSSHからの認証を魔法のように再利用するソリューションがあれば、もっと興味があります(おそらくSSHの代替品を探し始めます...)。
ボルデウィン

@Boldewyn:はい、「パスワードなしのsudo」の設定にはセキュリティリスクがあります...オプションの手順です。SSHが認証を再利用できる場合、この種の「解決策」は必要ありません。コメントありがとうございます。
-lepe

-1

次のコマンドを実行して、対話性なしでrootアクセスを取得できます。

ssh server " sudo command" < sudopassword.txt

1
stdinは端末デバイスではないため(指定されたファイルから読み取るため)、これは機能しません。
アンソニーG-モニカの正義
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.