我正在嘗試psql與用戶一起運行postgres。當我在新會話中運行sudo su - postgres然后 運行時psql,它運行順利。事實上,~/.bashrc在那個會話中使用postgres的是正確的PATH。
但是,如果我運行sudo -u postgres psql,我會得到sudo: psql: command not found。即使我運行此命令的會話(我使用 FISH shell)也具有正確的 PATH,并且我可以psql在沒有完整路徑的情況下與我的用戶一起呼叫。
我需要呼叫命令 as sudo -u postgres psql,如何解釋這種行為?
編輯:如果(來自 FISH)我切換到 BASH 并運行sudo -u postgres psql,它會起作用!我想這與 FISH 路徑有關......
編輯 2:問題似乎是使用sudo.
? ~ psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "opc" does not exist
? ~ sudo -u postgres psql
sudo: psql: command not found
? ~ echo $PATH
/home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin /usr/pgsql-15/bin /usr/local/bin /usr/bin /usr/local/sbin /usr/sbin
? ~ sudo echo $PATH
/home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin /usr/pgsql-15/bin /usr/local/bin /usr/bin /usr/local/sbin /usr/sbin
? ~ sudo -u postgres /usr/pgsql-15/bin/psql
could not change directory to "/home/opc": Permission denied
psql (15.1)
Type "help" for help.
postgres=#
但是如果我用 sudo 回顯 $PATH,它似乎很好......
uj5u.com熱心網友回復:
這是由sudo具有“secure_path”設定的配置引起的。這會導致 sudo 將 $PATH 重置為硬編碼的“已知安全”值。這可能由您的發行版啟用。
當您運行sudo bash時,bash 將讀取它的設定,包括 .bashrc,如果您在其中設定 $PATH,那么它當然會再次擁有該 $PATH。
但是,如果您在不通過重置 $PATH 的 shell 的情況下運行命令,您將獲得硬編碼設定。
可以通過運行sudo visudo和更改顯示的行來更改該設定
Defaults secure_path="some:path:here"
至
Defaults !secure_path
另一種方法是僅通過完全限定路徑運行命令,例如
sudo -u postgres (command -s psql)
關于您的測驗的另一條評論:
須藤回聲 $PATH
這不會做你想要的。$PATH 將被運行 sudo 的 shell 擴展,因此 sudo 將永遠看不到它的值。它完全等同于運行sudo echo /home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin ...。
你可能想使用類似
sudo env
或者
sudo sh -c 'echo $PATH'
反而。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535305.html
