Linux

os.system(…) 命令不起作用的 python 腳本的木偶執行

  • September 12, 2012

我正在嘗試使用 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",
}   

您可以通過指定的函式來獲取加密密碼,然後將其插入到語句中。

引用自:https://serverfault.com/questions/425688