2015-12-07 39 views
2

我創建了一個簡單的腳本,如下所示,名爲「/ usr/bin/mytool1」並使其可執行。rlwrap無法讀取/寫入自己的歷史記錄

#!/usr/bin/rlwrap /usr/bin/perl 

while (1) { 
    chomp($cmd = <STDIN>); 
    print "cmd=$cmd\n"; 
} 

問題是,如果我作爲普通用戶運行它,它工作正常。

然後我做了一個「sudo bash」,並以root身份運行mytool1,它也能正常工作。

現在我回來了作爲一個普通用戶,運行命令「mytool1」將使得像錯誤:

rlwrap: cannot read and write /home/user1/.perl_history: Permission denied 

我做了一些調查,這裏是我發現:

$ ls -l /home/user1/.perl_history 
-rw------- 1 root root 138 Dec 6 18:13 /home/user1/.perl_history 

問題這裏是,rlwrap將以root身份運行時將/home/user1/.perl_history的所有者更改爲root。

我覺得這是對rlwrap一個錯誤,因爲在Ubuntu的情況下,$HOME我沒有跑sudo bash後更改,rlwrap應該用$USER構建歷史文件。

您認爲如何?

回答

1

沒有必要進行修改和重新編譯rlwrap,只需在命令行上的歷史文件:

rlwrap --history-filename=$HOME/.${USER}_command_history command 

我感到意外的是Ubuntu的sudo保留默認$HOME,我不明白爲什麼這將永遠是有用的(也有occasional murmurings針對在Ubuntu上列出了此政策,但肯定沒有抗議的風暴)

在此期間,我會繼續rlwrap的行爲,因爲它是,但try to find out是否和其他程序如何避免這樣的問題此(not all of them do

漢斯(rlwrap維護者)

+0

謝謝@ hans-lub,您的解決方案是最好的!順便說一句,我想你的意思是說'rlwrap --history-filename = $ HOME /。$ {USER} _command_history command'。 – packetie

+0

你是對的!固定... –

1

sudo可能配置了安全策略而不更改環境變量,包括HOME。您可以嘗試使用-H選項覆蓋此行爲。有關更多詳細信息,請參閱man sudo

+0

感謝@Andrey的意見。我有其他工具可能會被破壞,如果我這樣做。寧願做一些事情來解決。謝謝。 – packetie

1

發現,對於我工作的解決方案:下載rlwrap source並進入src文件「main.c」文件和行604後,加

history_filename = malloc(100); 
sprintf(history_filename, "/home/%s/.%s_history",getenv("USER"), command_name); 

現在rlwrap將使用不同用戶的不同歷史文件。