別のユーザーおよび実行画面としてのSudo


167

今日、sudoを実行する別のユーザーとして実行中の画面が機能しないことがわかりました!

すなわち

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

「モニター」ユーザーとして実行するスクリプトがあります。出力を画面に表示するために、スクリーンセッションで実行します。問題は、自分のアカウント(ボブ、ジェームズ、スージーなど)でログインするユーザーが多数いることです。その後、「モニター」ユーザーにsudoします。「モニター」ユーザーへのアクセスを許可することは問題外です。


13
これはあなたが得ているエラーですか?「ターミナル '/ dev / pts / 0'を開けません-チェックしてください。」
ジム

そうだね。なぜそれが起こっているのか理解していますが、回避策はありますか?
luckytaxi

4
あなたのコマンドに対するコメント-私は人々が走ってsudo su "user" -いるのを見続けています。なぜ使用しないのsudo -u user -sですか?
アンドリューエイレット

2
@Jim:欠落しているエラーメッセージを提供するための+1。
デニスウィリアムソン

1
@Andrew私が知っているほとんどの人はそうしますsudo su-私はそれが人々が慣れるだけだと思います(私の場合は、sudoフラグを知る必要がないためですsudo su-私はsudoマンページを読んだことがないと思います:)
voretaq7

回答:


245

画面を起動する前にscript /dev/nullユーザーとして実行してみてくださいsu-それはゲットーの小さなハックですが、画面を幸せにするはずです。


5
Re:セキュリティへの影響、私は気づいていません(しかし、それは何もないことを意味するわけではありません:)-IIRCこれは、「スクリプト」が新しい端末デバイスを開くという副作用に依存します(ユーザーが呼び出したときに) 、スクリプトの出力を/ dev / nullに送信しているため、キャプチャするものは何もありません。また、ユーザーをttyグループ(
IMHO

2
、言った-あなたはUnixのシステム管理者なら@nalply率直に言って、あなたは混乱し、複数のシェルを見つけるべきではありませんscript起動するために使用することができますscreen。その後、終了する必要があるのは2回だけです(に1回、screenに1回su)。(これscriptを読むのに
時間をかける

10
または単に実行しsudo -u bob script -q -c 'screen -dr myscreen' /dev/nullます。次に、終了/デタッチする端末が1つだけになります。
アンディシュルマン

4
おかげで、これは私を救った。しかし、なぜこれはそれを修正するのですか?私が理解していることから、それは標準出力から...何もないところまですべてを印刷します。そして、それは何らかの形で画面を修正します。
sudo

3
@sudoそのことを行うためにscript、それを実行したユーザーが所有する独自のttyデバイスを開きます(見てみると/dev、実行後に表示されますscript)。screen次に、そのttyデバイス(実行中のユーザーが所有しているscreenため、アクセスに問題はありません)を取得します。これは完全なハック作業ですが、機能します。私のマシンのいくつかを見ると、画面の新しいバージョンがsetuid-rootをインストールしているように見えますが、これも動作しますが、別のsetuid-rootバイナリが浮かんでいるので、一部の人は正当に不快になります。
voretaq7

33

私がscreenするユーザーのためにラッパー関数を使用していますsudo su。これは、ユーザーに追加したラッパー関数です~/.bashrc

関数screen(){
  / usr / bin / script -q -c "/ usr / bin / screen $ {*}" / dev / null
}

これにより、使用する可能性のあるすべてのオプションとパラメーターscreenを使用できます。この関数をシステム全体に配置することを考えています。


1
完全に動作します。これをシステム全体に適用したい場合は、これを/etc/bash.bashrcに追加することをお勧めします-すべてのユーザーで機能します。
Someguy123

2
これは、スクリーンへの引数を正しく引用しません。そうでなければ、良い解決策です。
8

7

とにかくホストにSSHで接続していると仮定すると、〜monitor / .ssh / authorized_keysファイルのモニターアカウントにアクセスする必要がある各ユーザーの公開sshキーを追加できます。次に、各ユーザーのリモートマシンで実行できます

ssh -t monitor@remote.machine画面-RD


これは別の優れたアプローチです-許可されたキーファイルで強制コマンドを指定する必要があります(ラッキータクシーの「「モニター」ユーザーへのアクセスを与えることは問題外です」上記の注意-強制コマンドはそれらを単にスクリーンセッションを添付)
voretaq7

2
彼が「彼らにアクセスを与えることは...問題外」と言ったが、「...彼らは「モニター」ユーザーにsudoをかける」とも言ったので、私は私の答えでそれをどのように扱うのか分かりませんでした。ただし、authorized_keysのコマンド制限を強制することで対応することに同意します。
アレックス

7

このエラーについて話していると仮定します。

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

ワンライナーは次のとおりです(たとえば、「エイリアスゴボブ」として使用できます)。

sudo su - bob -c "script -c bash /dev/null"'

説明:

これにより、ユーザーbobとしてシェル(ログインシェルなど)が開始されます。ユーザーbobがscript起動し、bash(ダッシュまたはksh ...)を呼び出すように指示され、セッションのコピーが破棄されます。


0

おそらく、問題のデバイスのアクセス許可を変更するか、そのデバイスの読み取りアクセス許可を持つグループにモニターを追加する必要があります。これが私の最初の傾向です。しかし、そうすることのセキュリティへの影響を比較検討する必要があります。


0

あなたが言う:

sudo su "monitor" -

後ダッシュについて疑問に思っています。私は通常:

sudo su - username

ダッシュ(suのmanページによる)はsuに「シェルをログインシェルにする」ように指示します。これは、通常のシェルスタートアップスクリプトをすべてソースし、PATHやHOMEなどを適切に設定することを意味します。


3
いや。 sudo su - usernameそして、sudo su username -同じことを行います。
ティムルドウィンスキー14年

-4

私はちょうどこの問題にぶつかりました。chmod +rw $(tty)sudoを実行する前に解決しました。このソリューションの問題は、その後だれでも端末に接続してスヌープできることです。


2
素晴らしい解決策のように思えます。
エヴァンキャロル

10
@EvanCarrollこれは素晴らしいソリューションです。ただし、全世界に彼の端末への読み書きアクセスを提供する部分を除きます。ちょっとしたセキュリティの問題です-もちろん、パスワードを受け入れる前に端末のセキュリティをチェックするものを除いて、プログラムはそれを気にしません(gpgたとえば)。そして、確かに彼は見て悪意のあるユーザーとシステムになることは決してないだろうtty...とパスワードを盗聴
voretaq7

注意してください:これを自宅で絶対に試さないでください!これは危険です!!!
-ruizpauker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.