
全体的な問題は、ログイン時に/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
まだに設定してください。sudo
newuser
$HOME
/home/myuser
bash
実行しようとすると~/.bashrc
小さな問題があります。 as newuser
、明示的にアクセス権を付与しないと、読み取り権限がない可能性があります/home/myuser/.bashrc
。そうでなければ、おそらくスキップされ.bashrc
た理由です。$HOME
それでも設定されているため、実行/home/myuser
は試行されません/home/newuser/.bashrc
。
sudo
設定するにはHOME=/home/newuser
:
-H
sudoコマンドでこのオプションを使用します。sudo -Hu newuser bash
- または、
Defaults>newuser always_set_home
ファイルに追加して次に切り替えるときにsudoers
自動的にホームディレクトリを設定します。newuser
Defaults:myuser always_set_home
または、コマンドを実行したときに新しいIDと一致するようにホームディレクトリを自動的に設定するには、sudoersファイルに追加します。myuser
sudo
- または、
Defaults always_set_home
sudoersファイルに追加して、sudo
システム上のすべてのコマンドに対してこの動作を強制します。 (一部のLinuxディストリビューションではこの機能をデフォルトで有効にします。)
ユーザーを切り替えるときにホームディレクトリを特に切り替えたくない場合は、新しいユーザーがプライベートシェルの起動ファイルを読み取ることができることを確認する必要があります。
sudo -u newuser bash
実行を許可するために必要な最小権限は/home/myuser/.bashrc
次のとおりです。
- 検索権限
/home/myuser
- 読み取り権限
/home/myuser/.bashrc
両方に共通の便利なユーザーグループがなく、ACLが利用できない場合myuser
(newuser
つまり、既存の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::---