ログインシェルにssh + sudo + su


11

sudo su特別な目的のユーザーとしてログインした残りのセッションを費やすためにのみ使用するマシンを定期的にsshで使用しています。一般的なワークフローは次のとおりです。

mymachine:~ me$ ssh me@othermachine
othermachine:~ me$ sudo su - specialuser # note: no password needed
othermachine:~ specialuser$ # do stuff

これをエイリアス化できる1行にまとめたいので、sudo su - specialuserボイラープレートを入力しなくても、各マシンにエイリアスを設定して、1つのコマンドで必要な場所に到達できます。私は多分設定することができme@othermachinesudo suのログイン時に、私はのように動作する柔軟性維持したいのですがme、私はする必要がある場合を。

注:私はothermachineそれを設定したり、その設定方法を制御したりすることはできません。これは、私が採用されたときに採用した確立されたワークフローです。)

私の最初の考えはちょうどだった

ssh me@othermachine "sudo su - specialuser"

この種の作品ですが、プロンプトが表示されず、^C強制終了してログアウトします。他にもさまざまなことが間違っていると思います。

フルログインシェルでリモートリモートsshコマンドを読んだ後、次のようなエキゾチックなものをいくつか試しました

ssh me@othermachine 'bash -l -c "sudo su - specialuser"'

そして

ssh me@othermachine 'bash -l -c "sudo su - specialuser"; bash'

-どちらも私は機能することを期待し、機能しませんでしたが、完全性のためにそれらを試してみるべきだと思いました(重複してしまうのを避けるため)。彼らは同じプロンプトレスシェルを生成しました(2番目のは、のシェルからのmeアフタープロンプトプロンプトレスシェルを追加exitしたものですspecialuser)。そして私は試しました

ssh me@othermachine "sudo su - specialuser -c bash -l"

しかし、それは私をちょうど得ました

sudo: no tty present and no askpass program specified

より良いアイデア?


~/.profile少し遅れてsudoコマンドを追加するのはどうですか?
アレックス

奇妙なケースでは、sudo私はヒットしたくないという考え^Cですか?私がもっと良いものを思いつくことができないなら、私はそれを試すかもしれません。
David Moles

1
su meからできspecialuserます。または中.profileまたは.bashrc、あなたが従わない場合sudoでは exit、あなたの最初はexit背中に行くことができますmeセッションを終了するために、第2に、。または、フラグファイルを使用することもできます。そのsudo[ -f ~/.keep.me ] && del ~/.keep.meと後[ \! -f ~/.keep.me ] && exitには次のmeようになり:>~/.keep.me; exitます。コマンドのスクリプトまたはエイリアスだけが必要です。これでexitセッションが終了meし、ログインセッションに戻ります。
AFH、2015

1
セキュリティ上の理由から(トロイの木馬を回避するため)/bin/bash、単純なものbashではなく、最終バージョンを記述することを検討してください。特に前があったら...sudo
Hastur

回答:


11

この行はあなたのために働くはずです

ssh -t me@machine "sudo su - specialuser" 

このソリューションでは、-tスイッチに応じてプロンプトが表示されるかどうかがわかります

ssh -t me@machine "/bin/bash -l"   # Give me a prompt

ssh  me@machine "/bin/bash -l"     # Give me NO prompt
ssh  me@machine                    # Give me NO prompt

からのメモ man ssh

-t
疑似tty割り当てを強制します。これは、リモートサービスマシン上で任意の画面ベースのプログラムを実行するために使用できます。これは、たとえばメニューサービスの実装時に非常に役立ちます。 複数の-tオプションは、sshにローカルttyがない場合でも、tty割り当てを強制します


これは私にとってはうまくいきます...ホスト固有の〜/ .ssh / config設定を介して行うこともできますか?
ちょっと

1
@where、はいRequestTTY force(これはと等しい-t)とRemoteCommand sudo su - specialuser!ただし、SSHを使用する他のプログラム(scp、rsyncなど)は、このホストでは正常に機能しないことに注意してください。
Robert Riedl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.