# sudo

- [The Difference Between Su, Sudo Su, Sudo -i, and Sudo -s](https://trendoceans.com/difference-between-su-sudo-su-sudo-i-and-sudo-s/)
- [How To Run All Programs In A Directory Via Sudo In Linux](https://ostechnix.com/run-programs-in-a-directory-via-sudo/)
- [10 Useful Sudoers Configurations for Setting 'sudo' in Linux](https://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/)

##### 常用指令

```shell
# 以用戶 john 執行 SHELL
sudo -u john bash -c "whoami"

# 以用戶 john 開啟 vnc 服務，-H 可保持用戶的 HOME；否則會是 /root。
sudo -H -u john bash -c "vncserver" 

# 以用戶 devrpt 執行 db2_get_tbs_usage.sh -d devrptdb
sudo -u devrpt -H -s /usr/local/bin/db2_get_tbs_usage.sh -d devrptdb
# 或
sudo -u devrpt -H bash -c "/usr/local/bin/db2_get_tbs_usage.sh -d devrptdb" 

# 避免密碼詢問
echo "ThisIsPassword" | sudo -S ls -l /root

# 檢查 sudo 權限
sudo -l -U <username>
```

##### 設定格式  


```
alang  ALL=(devrpt) /bin/bash,/usr/local/bin/db2_get_tbs_usage.sh 
```

> 內容格式:
> 
> &lt;使用者帳號&gt; &lt;登入者的來源主機名稱&gt;=&lt;可切換的身份&gt; &lt;可下達的指令&gt;
> 
> 如果要執行 SHELL Scripts，除了 scripts 路徑以外，還要加上 /bin/bash。

##### 限制可切換的帳號

限制某帳號只能切換至特定的另一個帳號，其餘帳號不允許切換。

```
developer-name  ALL=(ALL)       NOPASSWD:/usr/bin/sudo,/bin/su - app-user
```

##### 多管理者帳號

除了主要管理者需要知道 root 密碼以外，其餘管理者先以個人帳號登入系統，然後以免 root 密碼方式切換成 root。

```shell
# RedHat 7/8, /etc/sudoers.d/sysadmin
your-account    ALL=(ALL)       ALL
```

> 免 root 密碼切換至 root 方式

```shell
# RedHat 6/7/8
# 如果有詢問密碼，輸入個人帳號的密碼
sudo -i
sudo su -

# RedHat 4
sudo su -
# Or
sudo -s # NOTE: not root's profile
```

> sudo -i 沒有包含 /usr/local/bin 路徑？

方法一：以 root 執行 `visudo`

```
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
```

方法二：`/root/.bash_profile`

```bash
# Custom PATH
case :$PATH: in
    *:/usr/local/bin:*) ;;
    *) PATH=/usr/local/bin:$PATH ;;
esac
export PATH
```

<span style="color: rgb(187, 187, 187); font-family: var(--font-heading, var(--font-body)); font-size: 1.4em; font-weight: 400;">Disable 'su'</span>

Disable 'su' Access for Sudo Users in Linux

`visudo` :

```
# Cmnd alias spceification 
Cmnd_Alias DISABLE_SU = /bin/su

# Disable the su for the user trendoceans
trendoceans ALL=ALL, !DISABLE_SU
```

##### logfile

`visudo`:

```
# Log File:
Defaults    logfile="/var/log/sudo.log"
```