私はroot権限を持っていませんが、sudo
許可されたコマンドのリストを持つコンピュータで作業しています。これらのコマンドの1つはです/bin/su - foouser
。したがって、sudo su - foouser
fouserというインタラクティブシェルを入力して取得できます。これで何かを実行できますfoouser
。
問題は、これがfoouser
いくつかの重要な生産プロセスを作成するために使用される共有ユーザー/シェルであることです。簡単にカスタマイズしたり、好きな方法で設定することはできません。そして私はいつもその仕事をしてはいけません。これにより、私の端末とコマンド履歴は、私がログインした端末と私がいる端末との間に分割されますfoouser
。
私が本当にやりたいことは、単一のコマンドを実行し、コマンドをブロックし、コマンドが通常行うようfoouser
にstdoutとstderrをシェルに印刷してから、まだ自分でログインした状態で返す方法です。いいえfoouser
)。たとえば、as_foo bar
次のようにコマンドをbar
実行しfoouser
、stdoutとstderrを印刷し、戻りコードを返して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
ただし、このソリューションの動作を妨げる可能性があるいくつかの設定があります。always_set_home
sudoersファイルにsudoオプションが設定されているか、オプションが設定されているがenv_reset
リストHOME
に追加されていない場合は、とにかくリセットされます。この場合は、コマンドにオプションを追加して環境を保存するように明示的に要求してください。env_keep
HOME
-E
sudo
foouser
ログイン時とまったく同じ環境設定foouser
(同等の環境など)を実際に実行するには、sudo su - foouser
この-i
オプションを追加してこのオプションを具体的に要求してください。sudo -i -u foouser
100%正確な交換も同様ですsudo su - foouser
。
以前のバージョンのシステムにsudo
このオプションがない場合は、代わりにsudoと一緒に-i
この-H
オプションを使用してください。完璧な代替方法ではありませんが、十分です。これらの以前のバージョンにはsudo
セキュリティに敏感ないくつかの既知のバグがある可能性が高いため、とにかく更新する価値があります。
sudo -l
自分で使用して、sudoアクセスの定義方法と、どのsudoオプション(デフォルト項目とも呼ばれます)が適用されるかを確認できます。
答え2
追加のパラメータをに渡しますsu
。
sudo su - foouser sh -c 'echo $USER'