2014-04-03 21 views
2

我試圖在簡單密碼文件中替換密碼。新密碼是垃圾並且是隨機生成的。sed錯誤:替換表達式中的錯誤選項

例如,這裏是一個包含根帳戶的影子文件。

root:igXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+udyyyyyyyyyyyySgY=:10933:0:99999:7::: 

我有下面的表達式,其中工作3出4嘗試。

在第四次嘗試中,我得到這個錯誤「替代表達式中的sed:bad選項」。

另一次,它工作得很好。密碼被隨機生成的字符串替換。

sed -i "/root/ s/ *:[^:]*:/:"$(openssl rand -base64 32)":/ " shadow 

有人可以幫忙解釋一下這個問題嗎?

感謝, 大

回答

1

使用不同的控制字符,因爲/可能會出現在密碼字段也。

sed -i "/root/s^A *:[^:]*:^A:"$(openssl rand -base64 32)":^A" shadow 

這裏定界符是^A -

2

你的生成的密碼可能包括是魔到sed表達字符(ctrl-A使用CTRLV鍵一起鍵入)。一個稍微好一點的做法是:

$ password=$(openssl rand -base64 32) 
$ awk -F: -v OFS=: -v p="$password" '$1=="root"{$2=p}1' /etc/shadow 

由於大多數awk實現沒有就地功能,你需要寫一個臨時文件,並替換/etc/shadow(但是這可能更安全反正),或使用得心應手sponge實用程序是moreutils的一部分。

+1

謝謝,這個作品很棒。 – user2019842

+1

@ user2019842如果它幫助您解決了您的問題,請考慮接受答案。你可以通過點擊答案旁邊的勾號來做到這一點,以便它是綠色的。有關更多信息,請閱讀[this](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

+1

更具體地說,base64編碼可以包含'/'和'+'字符以及換行符。由於您使用'/'作爲'sed'命令的分隔符,因此base64編碼字符串中存在'/'會使其混淆...... – twalberg