我想通過 tcp 建立一個遠程 shell。
我已經讓它作業了,但有一個小問題:提示沒有出現在客戶端。
如果我的客戶端輸入echo hi,它會很好地列印hi在標準輸出(客戶端)上,并且 shell 行程保持打開狀態,直到他點擊ctrl-D或選擇以任何方式退出。
經過一些基本調查,我發現 bash 在 stderr 上列印其提示(例如,bash 2>/dev/null不會在任何終端上顯示任何提示)。
這可能是一個提示,但在我呼叫execveshell 行程之前,我以這種方式從我的服務器重定向到我的客戶端連接:
for (int i = 0; i < 3; i )
{
dup2(client->confd, i);
}
execve("/bin/bash", (char *[]){"bash", NULL}, NULL);
由于我的服務器的 stdout (1) 被很好地重定向到我的客戶端連接 fd,stderr (2) 也應該。我說得對嗎?
我不知道如何解決它,任何幫助將不勝感激。
更多背景:
- 如果我在客戶端輸入無效命令,則會出現一條訊息,這意味著 stderr 被重定向。
- 如果我在服務器端重定向之前將 stderr 重定向到 stdout,然后將 stdin/stdout 重定向到我的客戶端連接 fd,則沒有任何變化。
- 我的客戶端連接到我的服務器是這樣的:
nc localhost 8080。 - 在重定向之前,我關閉了所有大于 2 的打開檔案描述符。
isatty(client->fd)回傳 0,所以也許她的 shell 提示沒有顯示在非 tty 描述符上,但在 readline 代碼或其他任何地方都找不到任何線索。
uj5u.com熱心網友回復:
男人猛擊:
互動式 shell 啟動時沒有非選項引數(除非指定了 -s)并且沒有 -c 選項,其標準輸入和錯誤都連接到終端(由 isatty(3) 確定),或者以 - 啟動我選擇。
非互動式 shell 通常根本不會列印提示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373043.html
上一篇:使用mongoose使用save()更新布林值時遇到問題
下一篇:Linux日期函式向前/向后時間
