2017-07-03 105 views
-1

我想在Perl中使用crypt哈希函數來哈希密碼。在bash腳本到目前爲止我有:密碼哈希不能用單引號

password='Pa$$word' 
hashedPassword="$(perl -e "print crypt('$password', 'salt'), \"\n"")" 

我然後使用SED修改/複製/ etc/shadow文件:

sed -e '/^user1:/s_:[^:]*:_:'"$hashedPassword"':_' /etc/shadow > /tmp/shadow 

方法的工作原理,將含有單引號的字符串時除外。我如何處理包含「單引號」的密碼?運行Solaris 10操作系統。

+0

你是怎麼調用'sed'的?這個命令中的單引號不應該是特殊的。例如:'hashedPassword =「start'end」&& echo'/^user1:/ s _:[^:] *:_:'「$ hashedPassword」':_''打印'/^user1:/ s _:[^ :] *:_:start'end:_',看起來不錯。 – l0b0

回答

1

你的問題是在bash中。嘗試設置一個包含單引號的shell變量(通過將它包含在單引號中)將不起作用。根據手冊頁:

用單引號括起來的字符會保留引號中每個字符的字面值。單引號之間可能不會出現單引號,即使前面加了反斜線。

1

提供密碼作爲參數傳遞給你一個班輪,而不是直接在代碼中插吧:

#!/usr/bin/env bash 

password='Pa$$word' 
hashedPassword=$(perl -e 'print crypt($ARGV[0], "salt"), "\n"' $password) 

echo "p='$password', h='$hashedPassword'" 

輸出:

p='Pa$$word', h='saFQXTeqbkiIQ' 
+0

今年我能說服你來倫敦Perl研討會嗎?給我發一封郵件,我們可以聊天。 :) – simbabque

+0

@simbabque哇!倫敦?!讓我考慮一下。我非常喜歡那個城市:-) – PerlDuck

+0

你去了那裏:http://act.yapc.eu/lpw2017/倫敦人傳統上在星期六,而且是免費的。不幸的是,與其他人相比,這次旅行更昂貴。你確實想念漢堡和阿姆斯特丹的Perl大會。我覺得那個和你很接近,不是嗎? – simbabque

0

由於密碼包含$$是語法在Perl中,在腳本中傳遞並不容易,其他選項是通過參數或環境傳遞。

# by argument 
perl -e '($password, $salt)[email protected];print crypt($password, $salt), "\n"' "$password" "$salt" 

# by environment variable 
password=$password salt=$salt perl -e 'print crypt($ENV{password}, $ENV{salt}), "\n"'