Linux
os.system(…) 命令不起作用的 python 腳本的木偶執行
我正在嘗試使用 puppet 管理 Unix 使用者。Puppet 提供了足夠的工具來創建帳戶和提供authorized_keys 文件,但沒有設置使用者密碼,它告訴使用者。
我所做的是一個 python 腳本,它生成一個隨機密碼並通過電子郵件將其發送給使用者。問題是,用 python 啟動 passwd Unix 命令是不可能的,然後我用命令編寫了一個 bash 腳本:
echo -ne "$password\n$password\n" | passwd $user passwd -e $user
手動啟動,腳本工作正常,創建的使用者通過電子郵件發送密碼。但是當 puppet 啟動它時,只有 python 腳本被執行,就好像 os.system(’/bin/bash my_bash_script’) 被忽略了。不顯示錯誤。並且使用者得到了它的密碼,但是 passwd 命令沒有被啟動。
木偶阻止執行我描述的內容是否有任何限制?或者,我怎樣才能更改使用者帳戶、過期時間和通過電子郵件發送密碼?
我可以提供更多資訊,但現在,我不知道哪些是準確的。
非常感謝!
編輯:這是具有相同症狀的基本程式碼:
蟒蛇:setuserpassword.py
#!/usr/bin/python import os import sys user = sys.argv[1] mail = sys.argv[2] os.system('/bin/bash /root/tools/setuserpassword.sh '+user+' '+mail)
重擊:setuserpassword.sh
#!/bin/bash # Password setup for the account password=`pwgen -N1 --secure 10` echo -ne "$password\n$password\n" | passwd $USER > /dev/null 2>&1 [[ $? -ne 0 ]] && exit 2 # Setup the expirancy label to make sure user # change its password upon fist success login chage -d0 $USER # Email sending to inform user of his new password echo -ne "Hello, $USER;\n The password is:\n $password\n" | mail -s "$USER account created" $MAIL
這是模組(這邊沒問題)
define add_user ( $email, $uid, $gid ) { $username = $title user { $username: comment => "$email", home => "/home/$username", shell => "/bin/bash", uid => $uid, gid => $gid, } exec { "/root/tools/setuserpassword.py $username $email": path => "/bin:/usr/bin:/usr/sbin/sbin", refreshonly => true, subscribe => user[$username], onlyif => "cat /etc/shadow | grep $username | grep '!'", require => Package['pwgen'], }
無需使用 bash 腳本,只需使用我用於其他一些東西的下一個函式來生成影子加密密碼:
def shadow(self,password): SomeZolt="$6$"+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(9))+"$" return crypt.crypt(password, SomeZolt)
之後向您的 python 腳本編寫附加功能,該腳本將打開 /etc/shadow 文件並寫入您通過使用此功能為該使用者獲得的加密密碼,從而製作如下行:
some_user:!!:15579:0:99999:7:::
看起來像:
some_user:$1$JShdquwdjsd38hSJhdqwdkwd:15579:0:99999:7:::
因此 some_user 將具有分配的密碼。
另外,您可以直接在 puppet 語句中設置使用者,方法是將其更改為:
user { $username: comment => "$email", home => "/home/$username", shell => "/bin/bash", uid => $uid, gid => $gid, password => "SomeAlreadyEncryptedPassword", }
您可以通過指定的函式來獲取加密密碼,然後將其插入到語句中。