私はルート権限のないマシンで作業していますが、許可されているsudo
コマンドのリストがあります。これらのコマンドの 1 つが です/bin/su - foouser
。 と入力するsudo su - foouser
と、foouser として対話型シェルが起動します。その後、 としていくつかの操作を実行できますfoouser
。
問題は、foouser
特定の重要な生産プロセスを起動するために使用される共有ユーザー/シェルであることです。簡単にカスタマイズしたり、希望どおりに設定したりすることはできません。また、一貫して作業するべきではないため、ターミナルとコマンド履歴が、自分自身としてログインしているターミナルと、 としてログインしているターミナルの間で分割されますfoouser
。
私が本当にやりたいのは、単一のコマンドを として実行しfoouser
、それをブロックし、コマンドが通常行うように stdout と stderr をシェルに出力し、私自身としてログインしたまま ( ではなく) 戻る方法です。これは、たとえば、コマンド を として実行し、 stdout と stderr を出力し、 の戻りコードを返し、その後シェルに戻るようfoouser
にスクリプトにカプセル化することができます。as_foo bar
bar
foouser
bar
システム管理者に権限の変更を依頼できます。たとえば、bar
sudo リストに追加してもらい、 (おそらく) を使用して、su -c
説明した方法で bar を実行できます。ただし、翌日に を実行したい場合はbar2
、再度管理者に問い合わせる必要があります。
このジレンマから抜け出す方法はあるのでしょうか? 明らかに、私はfoouser
好きなだけコマンドを実行して、セキュリティの面で違いがないように思えるので、これはかなりばかげているように思えます。これを可能にする明白で便利な方法が見つからないだけです。
答え1
sudo su - foouser <command>
root として実行するには、少なくとも制限付きの root アクセスが必要ですsu - foouser <command>
。
sudo -u foouser <command>
必要な操作を 1 ステップで実行できます。ただし、システム管理者が次のようにアカウントsudo
へのアクセスを許可している必要があります。foouser
ignacio ALL=(foouser) ALL
代わりに次のようにします:
ignacio ALL=(root) su - foouser
このように設定するとsudo
、たとえば、想定したようなエイリアスを定義できるようになります。
as_foo='sudo -u foouser'
また、 を避けることでsu -
、独自のカスタマイズを使い続けることができるかもしれません。 をsudo
このように使用すると、ユーザーIDのみが変更され、HOME
以前の値は保持され、シェル起動スクリプトやその他のカスタマイズが読み込まれます。あなたの'sの代わりにホーム ディレクトリを使用しますfoouser
。
(もちろん、それらのスクリプトは他のユーザーからも読み取り可能である必要があり、実行する可能性のある共有スクリプトは、foouser
のホーム ディレクトリ/home/foouser
を ではなくとして明示的に参照する方がよいでしょう$HOME
。)
sudo
ただし、このソリューションが機能しない設定がいくつかあります。sudoersalways_set_home
ファイルで sudo オプションが設定されている場合、またはリストにenv_reset
追加せずにオプションが設定されている場合は、いずれにせよリセットされます。このような状況では、コマンドにオプションを追加して、環境を保持するように明示的に要求してみてください。HOME
env_keep
HOME
-E
sudo
foouser
そして、としてログインしたときとまったく同じ環境設定で何かを実行したい場合foouser
(つまり、 と同等sudo su - foouser
)、-i
そのことを具体的に要求するオプションを追加します。 はsudo -i -u foouser
の 100% 正確な置き換えですsudo su - foouser
。
sudo
の非常に古いバージョンでオプションがないシステムを見つけた場合は-i
、-H
代わりに sudo でオプションを使用してください。これは完全な代替品ではありませんが、十分な場合があります。 のこのような古いバージョンには、sudo
セキュリティに関係する既知のバグもいくつかある可能性が高いため、いずれにしても更新する価値はあります。
sudo -l
自分自身で as を使用すると、sudo アクセスがどのように定義されているか、どの sudo オプション (別名、デフォルト エントリ) が有効になっているかを正確に確認できます。
答え2
追加の引数を に渡しますsu
。
sudo su - foouser sh -c 'echo $USER'