当前位置:首页 > 知道中心 > Linux > 文章

CloudStack设置Linux重置密码功能

发表于:2013-08-29| 次阅读| 作者:藕码网
TAG: Linux
摘要:CloudStack设置Linux重置密码功能

接着上文讲CloudStack下设置重置Linux系统密码。这里我们主要分别介绍CentOS和Ubuntu下如何设置。

CentOS

1、下载重置密码的脚本cloud-set-guest-password,脚本内容具体见文章下面的附件;

2、将文件上传到/etc/init.d;

3、检查文件格式:cat -v cloud-set-guest-password(如果发现有乱码,则运行dos2unix cloud-set-guest-password)

    这一步很重要,很多重置密码失败都是因为编码的问题;

4、给文件设置运行权限:chmod +x /etc/init.d/cloud-set-guest-password;

5、加入启动项:chkconfig --add cloud-set-guest-password。


Ubuntu

1、下载重置密码的脚本cloud-set-guest-password,脚本内容具体见文章下面的附件;

2、将文件上传到/etc/init.d;


3、检查文件格式:cat -v cloud-set-guest-password(如果发现有乱码,则运行dos2unix cloud-set-guest-password)

    这一步很重要,很多重置密码失败都是因为编码的问题;

4、加入启动项:sudo update-rc.d cloud-set-guest-password defaults 98;


5、设置sh指向:dpkg-reconfigure dash(会弹出框,选择否)。


附件:

CentOS下的cloud-set-guest-password脚本内容:


#!/bin/bash
#
# cloud-set-guest-assword   Init file for Password Download Client
#
# chkconfig: 2345 98 02
# description: Init file for Password Download Client

### BEGIN INIT INFO
# Provides: cloud-set-guest-password
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $syslog
# Should-Start: $syslog
# Should-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Init file for Password Download Client
# Description:       Init file for Password Download Client
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Modify this line to specify the user (default is root)
user=root

# Add your DHCP lease folders here
DHCP_FOLDERS="/var/lib/dhclient/*"

function cloud_set_guest_password() {
    password_received=0
    file_count=0
    error_count=0

    for DHCP_FILE in $DHCP_FOLDERS; do
        if [ -f $DHCP_FILE ]; then
            file_count=$((file_count+1))
            PASSWORD_SERVER_IP=$(grep dhcp-server-identifier $DHCP_FILE | tail -1 | awk '{print $NF}' | tr -d '\;')

            if [ -n $PASSWORD_SERVER_IP ]; then
                logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in $DHCP_FILE"
                logger -t "cloud" "Sending request to password server at $PASSWORD_SERVER_IP"
                password=$(wget -q -t 3 -T 20 -O - --header "DomU_Request: send_my_password" $PASSWORD_SERVER_IP:8080)
                password=$(echo $password | tr -d '\r')

                if [ $? -eq 0 ]; then
                    logger -t "cloud" "Got response from server at $PASSWORD_SERVER_IP"

                    case $password in
                    
                    "")					logger -t "cloud" "Password server at $PASSWORD_SERVER_IP did not have any password for the VM"
                                        continue
                                        ;;
                    
                    "bad_request")		logger -t "cloud" "VM sent an invalid request to password server at $PASSWORD_SERVER_IP"
                                        error_count=$((error_count+1))
                                        continue
                                        ;;
                                        
                    "saved_password") 	logger -t "cloud" "VM has already saved a password from the password server at $PASSWORD_SERVER_IP"
                                        continue
                                        ;;
                                        
                    *)					logger -t "cloud" "VM got a valid password from server at $PASSWORD_SERVER_IP"
                                        password_received=1
                                        break
                                        ;;
                                        
                    esac
                else
                    logger -t "cloud" "Failed to send request to password server at $PASSWORD_SERVER_IP"
                    error_count=$((error_count+1))
                fi
            else
                logger -t "cloud" "Could not find password server IP in $DHCP_FILE"
                error_count=$((error_count+1))
            fi
        fi
    done

    if [ "$password_received" == "0" ]; then
        if [ "$error_count" == "$file_count" ]; then
            logger -t "cloud" "Failed to get password from any server"
            exit 1
        else
            logger -t "cloud" "Did not need to change password."
            exit 0
        fi
    fi

    logger -t "cloud" "Changing password ..."
    echo $password | passwd --stdin $user
                            
    if [ $? -gt 0 ]; then
        logger -t "cloud" "Failed to change password for user $user"
    fi

    logger -t "cloud" "Successfully changed password for user $user"
    logger -t "cloud" "Sending acknowledgment to password server at $PASSWORD_SERVER_IP"
    wget -t 3 -T 20 -O - --header "DomU_Request: saved_password" $PASSWORD_SERVER_IP:8080
}

# See how we were called.
case "$1" in
  start)
    action $"Starting cloud-set-guest-password: " /bin/true
    cloud_set_guest_password
    RETVAL=$?
    ;;
  stop)
    action $"Shutting down cloud-set-guest-password: " /bin/true
    RETVAL=$?
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *) 
    echo $"Usage: cloud-set-guest-sshey {start}"
    RETVAL=2
    ;;
esac

exit $RETVAL



Ubuntu下的cloud-set-guest-password脚本内容:


#!/bin/bash
#
# Init file for Password Download Client
#
### BEGIN INIT INFO
# Provides:             cloud-set-guest-password
# Required-Start:       $local_fs $syslog $network
# Required-Stop:        $local_fs $syslog $network
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Init file for Password Download Client
### END INIT INFO

set -e

. /lib/lsb/init-functions

# Modify this line to specify the user (default is root)
user=root

# Add your DHCP lease folders here
DHCP_FOLDERS="/var/lib/dhcp/* /var/lib/dhcp3/*"

function cloud_set_guest_password() {
    password_received=0
    file_count=0
    error_count=0

    for DHCP_FILE in $DHCP_FOLDERS; do
        if [ -f $DHCP_FILE ]; then
            file_count=$((file_count+1))
            PASSWORD_SERVER_IP=$(grep dhcp-server-identifier $DHCP_FILE | tail -1 | awk '{print $NF}' | tr -d '\;')

            if [ -n "$PASSWORD_SERVER_IP" ]; then
                logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in $DHCP_FILE"
                logger -t "cloud" "Sending request to password server at $PASSWORD_SERVER_IP"
                password=$(wget -q -t 3 -T 20 -O - --header "DomU_Request: send_my_password" $PASSWORD_SERVER_IP:8080)
                password=$(echo $password | tr -d '\r')

                if [ $? -eq 0 ]; then
                    logger -t "cloud" "Got response from server at $PASSWORD_SERVER_IP"

                    case $password in
                    "")
                        logger -t "cloud" "Password server at $PASSWORD_SERVER_IP did not have any password for the VM"
                        continue
                        ;;
                    "bad_request")
                        logger -t "cloud" "VM sent an invalid request to password server at $PASSWORD_SERVER_IP"
                        error_count=$((error_count+1))
                        continue
                        ;;
                    "saved_password")
                        logger -t "cloud" "VM has already saved a password from the password server at $PASSWORD_SERVER_IP"
                        continue
                        ;;
                    *)
                        logger -t "cloud" "VM got a valid password from server at $PASSWORD_SERVER_IP"
                        password_received=1
                        break
                        ;;
                    esac
                else
                    logger -t "cloud" "Failed to send request to password server at $PASSWORD_SERVER_IP"
                    error_count=$((error_count+1))
                fi
            else
                logger -t "cloud" "Could not find password server IP in $DHCP_FILE"
                error_count=$((error_count+1))
            fi
        fi
    done

    if [ "$password_received" == "0" ]; then
        if [ "$error_count" == "$file_count" ]; then
            logger -t "cloud" "Failed to get password from any server"
            exit 1
        else
            logger -t "cloud" "Did not need to change password."
            exit 0
        fi
    fi

    logger -t "cloud" "Changing password ..."

    if [ -x /usr/sbin/chpasswd ]; then
        echo "${user}:${password}" | chpasswd 
    else
        echo $password | passwd --stdin $user
        if [ $? -gt 0 ]; then
            logger -t "cloud" "Failed to change password for user $user"
            exit 1
        else
            logger -t "cloud" "Successfully changed password for user $user"
        fi
    fi

    logger -t "cloud" "Sending acknowledgment to password server at $PASSWORD_SERVER_IP"
    wget -t 3 -T 20 -O - --header "DomU_Request: saved_password" $PASSWORD_SERVER_IP:8080
}

case "$1" in
  start)
      log_action_msg "Starting cloud" "cloud-set-guest-password"
      sleep 10
      cloud_set_guest_password
      if [ $? -eq 0 ]; then
          log_end_msg 0
      else
          log_end_msg 1
      fi
      ;;
  stop)
      log_action_msg "Stopping cloud" "cloud-set-guest-password"
      log_end_msg 0
      ;;
  *)
      log_action_msg "Usage: /etc/init.d/cloud-set-guest-password {start}"
      exit 1
      ;;
esac

exit 0



注:本站部分信息可能源于互联网分享,如有侵权,请告知,我们将及时删除!

  • 用户评论
  • 相关文章