sudoは期待どおりbashrcを実行しません。

sudoは期待どおりbashrcを実行しません。

全体的な問題は、ログイン時に/etc/bashrcに応じてプロンプト形式が正しく指定されていますが、bashを使用して他のユーザーにsudoを実行するとプロンプトが奇妙になることです。

/etc/bashrcの基本フォーマット

PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

...そして...

prompt_host=`/bin/hostname`

注文する:

myuser で端末にログインします。私のプロンプトの形式は適切で、上記の/etc/bashrcと一致します。

[email protected] pwd :

上記は私の基本的なシェルプログラムがbashのように見えますが、shを使用していると思います。

echo $SHELL     <---not very meaningful but I expect someone will ask me to run this
/bin/sh

ps -p `echo $$`
  PID TTY          TIME CMD
 7105 pts/2    00:00:00 sh     <---which looks to be an interactive shell (no dash)

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
72338     9321  9320  0 01:07 pts/3    00:00:00 -sh   <---or is it a login shell????

./filethatsnotthere.sh
-sh: ./filethatsnotthere.sh: No such file or directory

最後に重要なのは…

getent passwd myuser
myuser:x:72338:25000:My Name:/home/myuser:/bin/sh

また、/etc/profileのソースが次の理由であることは明らかです。

echo $prompt_host
the.hostname.fully.qualified

したがって、shと/ etc / profileを取得するようです。しかし、これは混乱しています...

 ls -l `which sh`
lrwxrwxrwx. 1 root root 4 Jan 12  2018 /bin/sh -> bash

...ため息...しかし、私がshを使うという理論に従うとしても、bashを使ってnewuserにsudoを使います。 newuser には、/etc/bashrc で提供される newuser .bashrc で提供される newuser .bash_profile に設定された設定ファイルがあります。

ただし、newuserプロンプトが機能しないため、newuserプロファイルが実行されていないようです。プロンプトでホスト名が完全に失われました。

sudo -u newuser bash
newuser@ pwd         <---no hostname

実行時に確認するためにそこにechoステートメントを入れましたが、表示されないため、実行中の新しいユーザープロファイルがないことがわかります。それにもかかわらず、newuserが実際にbashを実行していることを確認しました。

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
newuser  11717 11715  0 03:47 pts/1    00:00:00 bash

ps -p `echo $$`
  PID TTY          TIME CMD
11717 pts/1    00:00:00 bash

./filethatsnotthere.sh
bash: ./filethatsnotthere.sh: No such file or directory

/etc/profileが実行されていません(ログインシェルではなく対話型シェルであるため意味があります):

echo $prompt_host
<crickets....>

しかし、 - newuserのスタートアップファイルも/ home / newuserディレクトリにありません。対話型シェルなので、/etc/profileを直接インポートしなくても、新しいユーザーのファイルを実行し続けたいと思います。

ベストアンサー1

sudo$HOMEユーザーの切り替え時に新しいユーザーと一致するように設定するか、一致しないように設定できます。あなたの場合は切り替えないように設定されているようです$HOME。特定のサービスアプリケーション専用のユーザーアカウントに切り替えたいのですが、使い続けたい場合に便利です。あなたのプライベートシェルの設定やその他の設定。

実際に~/.bashrcはの略語だけです$HOME/.bashrc

したがって、そうするときはユーザー名をに切り替えますが、sudo -u newuser bashまだに設定してください。sudonewuser$HOME/home/myuser

bash実行しようとすると~/.bashrc小さな問題があります。 as newuser、明示的にアクセス権を付与しないと、読み取り権限がない可能性があります/home/myuser/.bashrc。そうでなければ、おそらくスキップされ.bashrcた理由です。$HOMEそれでも設定されているため、実行/home/myuserは試行されません/home/newuser/.bashrc

sudo設定するにはHOME=/home/newuser

  • -Hsudoコマンドでこのオプションを使用します。sudo -Hu newuser bash
  • または、Defaults>newuser always_set_homeファイルに追加して次に切り替えるときにsudoers自動的にホームディレクトリを設定します。newuser
  • Defaults:myuser always_set_homeまたは、コマンドを実行したときに新しいIDと一致するようにホームディレクトリを自動的に設定するには、sudoersファイルに追加します。myusersudo
  • または、Defaults always_set_homesudoersファイルに追加して、sudoシステム上のすべてのコマンドに対してこの動作を強制します。 (一部のLinuxディストリビューションではこの機能をデフォルトで有効にします。)

ユーザーを切り替えるときにホームディレクトリを特に切り替えたくない場合は、新しいユーザーがプライベートシェルの起動ファイルを読み取ることができることを確認する必要があります。

sudo -u newuser bash実行を許可するために必要な最小権限は/home/myuser/.bashrc次のとおりです。

  • 検索権限/home/myuser
  • 読み取り権限/home/myuser/.bashrc

両方に共通の便利なユーザーグループがなく、ACLが利用できない場合myusernewuserつまり、既存のUnixスタイル権限のみ)、これは従来のアプローチです。

chmod 711 /home/myuser          # i.e. directory permissions drwx--x--x
chmod 644 /home/myuser/.bashrc  # i.e. file permissions      -rw-r--r--

ホームディレクトリを含むファイルシステムにACLを使用できる場合は、次の手順を実行して必要な最小限のアクセス権を付与できます。

setfacl -m u:newuser:x /home/myuser
setfacl -m u:newuser:r /home/myuser/.bashrc

ホームディレクトリの権限が最初にあった場合、drwx------このコマンド以降の権限は/home/myuser次のとおりですdrwx--x---+。完全なACLを確認するには、次を使用しますgetfacl

$ getfacl /home/myuser
getfacl: Removing leading '/' from absolute path names
# file: home/myuser
# owner: myuser
# group: myuser
user::rwx
user:newuser:--x
group::---
mask::--x
other::---

おすすめ記事