2013-03-10 92 views
0

問題的上下文是,我試圖將單引號的密碼傳遞給openssl配置文件的input_password參數。sed用反斜槓單引號替換openssl配置文件的單引號

openssl configuration file manual摘自:

有可能通過使用任何種類報價 或\字符逃避某些字符。通過使一行的最後一個字符爲\ ,字符串可以分佈在多行上。此外,序列 \ n,\ r,\ b和\ t被識別

我假定單引號可以轉義。問題是我很難用sed生成單引號。

這樣,我的意思是,如果從腳本或從命令行運行,下列表達式不會產生相同的結果。看看下面的命令:

cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|\\\'|g" 

其中「$ EMPLOYEE_CREDENTIALS_FILE」是格式化像

username:password 

當我直接在bash運行此命令時,它會產生我以爲openssl.conf輸出文件容忍:

tentacle caravan sovereignty appraisal sass\'s 

當我在腳本運行它,它只是產生正常的轉義密碼:

tentacle caravan sovereignty appraisal sass's 

我想知道我做錯了什麼。

+0

這似乎很清楚問題是什麼。 「我有一個問題,試圖將帶有單引號的密碼傳遞給openssl配置文件的input_password參數。」我想出了一個不起作用的解決方案。因此,答案應該糾正命令以允許轉義發生,或者提供另一種方法來處理帶有單引號的密碼短語。我不知道我能否更清楚。 – 2013-03-11 01:56:06

+0

我「認爲」,因爲文檔沒有明確說明單引號是否可以轉義: 「可以通過使用任何引號或\字符來轉義某些字符。通過將一行的最後一個字符\值字符串可以分佈在多行中。另外,序列\ n,\ r,\ b和\ t被識別爲「從http://www.openssl.org/docs/apps/config.html獲取」。 – 2013-03-11 02:22:17

回答

0

我終於解決了這個問題。

我現在可以確認openssl配置文件允許在input_password字段中出現轉義單引號。不僅如此,openssl使用的實際密碼按預期未被轉義。最終用戶永遠不會知道密碼已在配置文件中轉義。

我在腳本內部做了sed工作時遇到了一些麻煩,因爲從我理解的雙引號中消耗了反斜槓而不是單引號。另一方面,單引號不會消耗反斜槓,因爲它不能解釋轉義字符。這意味着我無法在單引號內跳過單引號。

這花了我一個解決方案

cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|"'\\\'"'|g" 

這類似於this stackoverflow question找到了答案,但它不適合我的情況下工作。

的原因是需要3個反斜槓的答案也被找到:

利用周圍sed命令雙引號,則刪除需要 擔心嵌入單引號。你不必擔心 逃跑,因爲shell會吸收一個級別的逃脫。