Shell-Script

這個 HOME 環境變數在哪裡,我還需要添加什麼 -H 呢?

  • December 23, 2013

我最近嘗試執行一個失敗的啟動腳本,我不知道它為什麼會失敗,所以我在這裡發布了一個關於此的問題。

chkconfig 啟動腳本失敗,腳本手動執行良好

使用者 schaiba 建議我>> /tmp/test.log 2>&1在啟動腳本末尾添加以記錄並找出它不啟動的原因。

我意識到它有以下問題。

sudo:對不起,你必須有一個 tty 才能執行 sudo 失敗

我查看了我的腳本並找到了這一行,這幾乎是啟動我的 java 程序的重要行。(這是$cmd

javaCommand="java"                                         # name of the Java launcher without the path
javaArgs="-classpath .:recaptcha4j-0.0.8.jar:mysql-connector-java-3.0.17-ga-bin.jar ChatServer"                     # arguments for Java launcher
javaCommandLine="$javaCommand $javaArgs"                       # command line to start the Java service application

cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"

  # Don't forget to add -H so the HOME environment variable will be set correctly.
  sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1

在查看如何處理有關 sudo 失敗的錯誤時.. 許多解決方案表明我應該禁用另一篇文章中寫的預設設置require-tty會給etc/sudoers我一個安全漏洞,SSH 使用者可以看到我的 root 密碼,即使 SSH 已經登錄 root 哈哈,無論如何我不想禁用任何安全性。

我的猜測是我需要將 -H 添加到一些 Home 環境變數中,我不知道這意味著什麼,有人知道我必須在那裡做什麼嗎?

$SHELL腳本中的任何地方都找不到變數,$serviceUserroot.

$HOME是在使用者登錄時設置的環境變數。根據您的登錄方式,設置它的實際程序可能會有所不同。如果您通過控制台登錄(包括telnet/rlogin/etc),那麼它將由login程序設置。如果您通過 SSH 登錄,它將由sshd. 如果您使用桌面管理器登錄,您的桌面管理器可能會為您設置它。

您需要使用的原因-H是在執行 sudo 時重置$HOME環境變數,以便另一端獲取其他使用者的$HOMEsudo,而不是您正在執行 sudo 的使用者,某些環境允許傳播。

然而,這不是你真正的問題。當 sudo 提示輸入密碼時,您需要一個 tty,而在執行非互動式腳本時您沒有。考慮到您從其他地方獲得此腳本,這可能意味著此腳本要麼 a.) 未正確編寫,要麼 b.) 僅在已以 root 身份執行時編寫使用(也許-H這裡被用作嘗試清理的迂迴方式一個潛在的 unclean $HOME,儘管這樣做有點奇怪)。

我建議聯繫作者或維護者。

引用自:https://unix.stackexchange.com/questions/106302