需求描述:
今天在做通過echo結合passwd給用戶改密碼的過程中,出現無法修改的錯誤.
錯誤如下:
[root@testvm ~]# useradd mytest [root@testvm ~]# echo "my@test!" | passwd --stdin mytest -bash: !": event not found
錯誤分析:
經過查找該命令發現嘆號!在linux中有特殊的定義,可以用來執行歷史的命令或者當做邏輯否定等方式來使用,所以呢,嘆號是一個特殊的字符,想要將字符進行當做普通字符來使用,必須進行轉義.
問題處理:
1.通過轉義字符對!號進行轉義
[root@testvm ~]# echo "my@test\!" my@test\!
備注:發現這樣的輸出里面就多了\.所以,這個方法不對.
2.echo后面使用單引號輸出
[root@testvm ~]# echo 'my@test!' my@test!
[root@testvm ~]# echo '$my@test! \ # %'
$my@test! \ # %
備注:如果使用單引號,那么就會原樣的輸出字符串,不進行轉義,不取變量值
3.再次通過echo和passwd修改用戶密碼
[root@testvm ~]# echo 'my@test!' | passwd --stdin mytest Changing password for user mytest. passwd: all authentication tokens updated successfully. [root@testvm ~]# su - mytest [mytest@testvm ~]$ su - mytest Password: [mytest@testvm ~]$
備注:這樣就可以在密碼中包括!這個符號了.
4.經過測試發現,如果使用雙引號輸出字符最后一位是嘆號!會報錯,如果后面有空格就不會報錯
[root@testvm ~]# echo "my@test! " #后面有空格,就能夠輸出嘆號,所以如果嘆號是最后一位是要接事件event的,但是這樣密碼中也有空格了. my@test! [root@testvm ~]# echo "my@test!" -bash: !": event not found
5.經過測試,echo后面直接接字符就可以即不將其放入到單引號也不放在雙引號中
[root@testvm ~]# echo my@test! | passwd --stdin mytest Changing password for user mytest. passwd: all authentication tokens updated successfully. [root@testvm ~]# su - mytest [mytest@testvm ~]$ su - mytest Password: [mytest@testvm ~]$
備注:同樣達到一樣的效果,這里沒有使用單引號,也沒有使用雙引號.
文檔創建時間:2018年7月2日13:28:20
文檔修改1:增加4這個測試,使用雙引號,!號后面加空格可以輸出,但是密碼不符合預期的要求. 時間:2018年7月2日13:35:08
文檔修改2:增加5的內容,echo后面不使用單引號,也不使用雙引號進行嘆號的輸出. 時間:2018年7月2日13:43:44