2015-05-29 24 views
3

我正在構建ram文件系統,並生成了一個「/」目錄。我想在生成的「etc/shadow」文件中設置默認的根密碼。 實際的文件是:Linux在etc/shadow文件上設置root密碼

root:*:15980:0:99999:7::: 
bin:*:15980:0:99999:7::: 
daemon:*:15980:0:99999:7::: 
adm:*:15980:0:99999:7::: 
... 
..... 

我想換成「根:*:」與「根:Hashedpassword:」我知道這是很容易與「HASHEDPASSWORD」來代替「*」,但它應該通過使用「root:anything:」模式完成,這也不應該是困難的,甚至 - 儘管我想在這裏詢問它,因爲它可能對其他人有用。

例如:

我想設置的密碼是 「CentOS的」

鹽是 「XYZ」

我得到的散列通:

pass=$(openssl passwd -1 -salt xyz centos) 

然後我想用「sed」命令用「root:Hashedpassword:」替換「root:anything:」中的「anything」。

回答

2

您可以用GNU做的sed像

sed -i -e "s/^root:[^:]\+:/root:$pass:/" etc/shadow 

如果$pass可能/字符,你可以使用不同的分隔符,就像,如果不會在那裏。你可以這樣做:

sed -i -e "s,^root:[^:]\+:,root:$pass:," etc/shadow 

如果你沒有GNU的sed你可能沒有-i或者它可能需要一個參數。

你也可以使用awk做到這一點:如果你有一個新版本的GNU版本的awk你可以用-i像這樣做

awk -F: "BEGIN {OFS=FS;} \$1 == \"root\" {\$2=\"$pass\"} 1" etc/shadow 

awk -i inplace -F: "BEGIN {OFS=FS;} \$1 == \"root\" {\$2=\"$pass\"} 1" etc/shadow 
+0

謝謝你,但它給了「sed:-e表達式#1,字符51:未知選項's'」 –

+1

@Survivor有可能散列密碼中有'/'字符?如果是這樣,你可能想嘗試使用不同的分隔符,例如's,^ root:[^:] \ + :, root:$ pass :,'來使用',',除非你的逗號哈希 –

+0

「awk」一個工作,但「gawk」沒有「-i」,所以「awk」和「nawk」沒有它。 –