アナログが支払われているか、条件に適合していない場合はどうすればよいですか? もちろん、自分で書いてください。
条件:
- 〜50のリモートクライアントステーションがUbuntu Desktop(10.04-12.10)で実行されています。
チャレンジ:
- リモートクライアントステーションでのパッケージアップデートの可用性に関する情報の取得。
- 更新に使用可能なパッケージのロギングバージョン。
- 1つ/すべてのクライアントステーションのリモート更新。
ソリューションオプション:
私の知識は1つのプログラミング言語(bash)に限定されているため、実装はその言語で実行されます。
必要なもの:
- クライアントステーション上のssh-server。
- 管理用の一般ユーザー。
- Linuxサーバー(インストールする必要があります)。
- ネットワークボール(nfsを使用しました)。
仕組み:
ssh adm @ IP->必要な情報の収集->サーバーへのロギング->終了。
実際にどのように見えるか:
プログラムが起動すると、ユーザーと更新可能なパッケージに関する情報が表示されます。 メニューから手動で制御できる可能性があります。
システムに関する簡単な情報、更新可能なパッケージのリスト。
プログラムが作成するログファイルの例は、 ここからダウンロードできます。
実装:
/ root / uuman-プログラムのルートフォルダー。
../uuman/log-ログファイルのあるフォルダー(ネットワークボールです)。
../../log/.menu_log-リモートマシンに関する簡単な情報を含む隠しフォルダー。
setup-リモートマシンの初期設定用のファイル。
#!/usr/bin/expect -f set IP $argv # set timeout -1 # spawn ssh-copy-id -i /root/.ssh/id_rsa.pub adm@$IP expect -re "(yes/no)" # YES send "yes\r" # expect -re "Password:" # send "YOU_PASSWORD\r" # expect -re "expecting." # ssh spawn ssh adm@$IP expect -re "\\$ $" # sudo send "sudo -K\r" expect -re "\\$ $" # root send "sudo su\r" expect -re "password for" send "YOU_SUDO_PASSWORD\r" expect -re "# $" # ( samba nfs-common cifs-utils) send "apt-get install -y apt-show-versions nfs-common\r" expect -re "# $" send "exit\r" expect -re "\\$ $" exit 0
更新-利用可能なパッケージに関する情報を収集するためのファイル。
#!/usr/bin/expect -f set IP [lrange $argv 0 0] set USERN [lrange $argv 1 1] set DATES [exec date "+%Y.%m.%d/%H:%M:%S"] # ssh (adm ) spawn ssh adm@$IP # $ expect -re "\\$ $" # sudo send "sudo -K\r" expect -re "\\$ $" # root send "sudo su\r" expect -re "password for" send "YOU_SUDO_PASSWORD\r" # # expect -re "# $" # , send "mkdir -m 777 /tmp/share > /dev/null 2>&1\r" expect -re "# $" # nfs ( samba ) send "mount.nfs 192.168.0.1:/root/uuman/log /tmp/share\r" expect -re "# $" # send "date > /tmp/share/$IP.log\r" expect -re "# $" # , send "uname -a >> /tmp/share/$IP.log\r" expect -re "# $" # send "echo Username:$USERN >> /tmp/share/$IP.log\r" expect -re "# $" #IP send "echo IP:$IP >> /tmp/share/$IP.log\r" expect -re "# $" # send "(echo -n Hostname:;hostname) >> /tmp/share/$IP.log\r" expect -re "# $" # Ubuntu send "(cat /etc/issue.net) >> /tmp/share/$IP.log\r" expect -re "# $" # send "(echo -n Count of packages for update:;apt-show-versions -u | wc -l) >> /tmp/share/$IP.log\r" expect -re "# $" # send "echo >> /tmp/share/$IP.log\r" expect -re "# $" # send "apt-show-versions -u | column -t >> /tmp/share/$IP.log\r" expect -re "# $" # ( | IP | ubuntu_version | - | ) send "(echo -n $USERN;echo -n ' |' $IP '| ';cat /etc/issue.net | sed 's/ /_/g';echo -n AvailableUpdates\:;apt-show-versions -u | wc -l ;echo -n $DATES) > /tmp/share/.menu_log/$IP.log\r" expect -re "# $" # send "umount -f /tmp/share\r" expect -re "# $" # root send "history -c\r" expect -re "# $" # root send "exit\r" expect -re "\\$ $" exit 0
パッケージ-クライアントマシンを更新するためのファイル。
#!/usr/bin/expect -f set IP [lrange $argv 0 0] set USERN [lrange $argv 1 1] set DATES [exec date "+%Y.%m.%d/%H:%M:%S"] # set timeout -1 spawn ssh adm@$IP expect -re "\\$ $" send "sudo -K\r" expect -re "\\$ $" send "sudo su\r" expect -re "password for" send "YOU_SUDO_PASSWORD\r" expect -re "# $" # send "apt-get -y upgrade\r" expect -re "# $" # send "mkdir -m 777 /tmp/share > /dev/null 2>&1\r" expect -re "# $" send "mount.nfs 192.168.0.1:/root/uuman/log /tmp/share\r" expect -re "# $" send "date > /tmp/share/$IP.log\r" expect -re "# $" send "uname -a >> /tmp/share/$IP.log\r" expect -re "# $" send "echo IP:$IP >> /tmp/share/$IP.log\r" expect -re "# $" send "(echo -n Hostname:;hostname) >> /tmp/share/$IP.log\r" expect -re "# $" send "(cat /etc/issue.net) >> /tmp/share/$IP.log\r" expect -re "# $" send "(echo -n Count of packages for update:;apt-show-versions -u | wc -l) >> /tmp/share/$IP.log\r" expect -re "# $" send "echo >> /tmp/share/$IP.log\r" expect -re "# $" send "apt-show-versions -u | column -t >> /tmp/share/$IP.log\r" expect -re "# $" send "(echo -n $USERN;echo -n ' |' $IP '| ';cat /etc/issue.net | sed 's/ /_/g';echo -n AvailableUpdates\:;apt-show-versions -u | wc -l ;echo -n $DATES) > /tmp/share/.menu_log/$IP.log\r" expect -re "# $" send "umount /tmp/share\r" expect -re "# $" send "apt-get -y upgrade\r" expect -re "# $" send "history -c\r" expect -re "# $" send "exit\r" expect -re "\\$ $" exit 0
uuman.sh-スタートアップファイル(メインファイル)。
#!/bin/bash # DATE=`date "+%Y.%m.%d/%H:%M:%S"` # LOCAL="/root/uuman/log" # WORKD="/root/uuman" #[\] spinner() { local pid=$1 local delay=0.25 while [ $(ps -eo pid | grep $pid) ]; do for i in \| / - \\; do printf ' [%c]\b\b\b\b' $i sleep $delay done done printf '\b\b\b\b' } # UPDATEA() { #2012_11_23 DATEFN=`date "+%Y_%m_%d"` # . nfs chown -R nfsnobody:nfsnobody $LOCAL i=0 # cat $WORKD/ip.txt | while read line; do USERN=`echo $line` # IP IP=`echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'` # if ping -c 1 -s 1 -W 1 $IP > /dev/null 2>&1; then i=`expr $i + 1` # screen screen -A -m -d -S "upd$i" expect $WORKD/update $IP $USERN # #screen -A -m -d -S "upd$i" expect $WORKD/setup $IP else # # echo "$DATE" >> $LOCAL/err.txt echo "$USERN - not connected" >> $LOCAL/err.txt echo >> $LOCAL/err.txt # echo "$DATE | $USERN - not connected" >> $LOCAL/upd.txt echo >> $LOCAL/upd.txt # echo "$DATE | $USERN - not connected" >> $LOCAL/UPD-$DATEFN.txt echo >> $LOCAL/UPD-$DATEFN.txt # - , not connected NT=`cat $LOCAL/.menu_log/$IP.log | grep "AvailableUpdates"` if [ -z "$NT" ]; then echo -n "$USERN | Unknown | NotConnected | $DATE" > $LOCAL/.menu_log/$IP.log fi fi done # ls $LOCAL | grep .log | while read TXT; do paste $LOCAL/$TXT >> $LOCAL/upd.txt echo >> $LOCAL/upd.txt # paste $LOCAL/$TXT >> $LOCAL/UPD-$DATEFN.txt echo >> $LOCAL/UPD-$DATEFN.txt done } # PACKAGEA() { #2012_11_23 DATEFN=`date "+%Y_%m_%d"` # . nfs chown -R nfsnobody:nfsnobody $LOCAL i=0 # cat $WORKD/ip.txt | while read line; do USERN=`echo $line` # IP IP=`echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'` # if ping -c 1 -s 1 -W 1 $IP > /dev/null 2>&1; then i=`expr $i + 1` # screen screen -A -m -d -S "upd$i" expect $WORKD/package $IP $USERN else # # echo "$DATE" >> $LOCAL/err.txt echo "$USERN - not connected" >> $LOCAL/err.txt echo >> $LOCAL/err.txt # echo "$DATE | $USERN - not connected" >> $LOCAL/upd.txt echo >> $LOCAL/upd.txt # echo "$DATE | $USERN - not connected" >> $LOCAL/UPD-$DATEFN.txt echo >> $LOCAL/UPD-$DATEFN.txt # - , not connected NT=`cat $LOCAL/.menu_log/$IP.log | grep "AvailableUpdates"` if [ -z "$NT" ]; then echo -n "$USERN | Unknown | NotConnected | $DATE" > $LOCAL/.menu_log/$IP.log fi fi done # ls $LOCAL | grep .log | while read TXT; do paste $LOCAL/$TXT >> $LOCAL/upd.txt echo >> $LOCAL/upd.txt # paste $LOCAL/$TXT >> $LOCAL/UPD-$DATEFN.txt echo >> $LOCAL/UPD-$DATEFN.txt done } # - () MAIN() { rm -rf $LOCAL/MENU.txt ls $LOCAL/.menu_log | grep .log | while read MENU; do # ( ) TEXT=`paste -s -d '|' $LOCAL/.menu_log/$MENU | sed 's/|/ | /g;s/-/|/g'` echo $TEXT >> $LOCAL/MENU.txt done # clear && cat $LOCAL/MENU.txt | column -t } # MENU() { echo echo "1.Get update-information for Ubuntu-host (by custom IP-address)" echo "2.Get update-information for all Ubuntu-hosts (uses file with IP-addresses)" echo "3.Update packages for Ubuntu-host (by custom IP-address)" echo "4.Update packages for all hosts (uses file with IP-addresses)" echo "5.View error-connection log" echo "6.Refresh" echo "7.Exit" read SELECT case $SELECT in 1) # IP echo -n "Enter IP:" read IP # . nfs chown -R nfsnobody:nfsnobody $LOCAL # if ping -c 1 -s 1 -W 1 $IP > /dev/null 2>&1; then # IP USERN=`cat $WORKD/ip.txt | grep "$IP" | sed 's/ .*//'` $WORKD/update $IP $USERN > /dev/null 2>&1 & spinner $! cat $LOCAL/$IP.log else # echo "Computer is not online" echo "$DATE" >> $LOCAL/err.txt echo "$IP - not connected" >> $LOCAL/err.txt echo >> $LOCAL/err.txt fi MENU ;; 2) # UPDATEA > /dev/null 2>&1 & spinner $! # , #sleep 5s MAIN MENU ;; 3) # IP echo "Enter IP:" read IP # . nfs chown -R nfsnobody:nfsnobody $LOCAL if ping -c 1 -s 1 -W 1 $IP > /dev/null 2>&1; then # IP USERN=`cat $WORKD/ip.txt | grep "$IP" | sed 's/ .*//'` $WORKD/package $IP $USERN > /dev/null 2>&1 & spinner $! cat $LOCAL/$IP.log else echo "Computer is not online" echo "$DATE" >> $LOCAL/err.txt echo "$IP - not connected" >> $LOCAL/err.txt echo >> $LOCAL/err.txt fi MENU ;; 4) # PACKAGEA > /dev/null 2>&1 & spinner $! # , #sleep 5s MAIN MENU ;; 5) # cat $LOCAL/err.txt MENU ;; 6) # MAIN MENU ;; 7) exit 0 ;; *) MENU esac } # # ARG=$1 case $ARG in # check) UPDATEA exit 0 ;; # update) PACKAGEA exit 0 ;; *) MAIN MENU ;; esac
ip.txt-ユーザーを含むベース-IP。
User1-192.168.0.1
ユーザー2-192.168.0.2
User3-192.168.0.3
User4-192.168.0.4
ユーザー2-192.168.0.2
User3-192.168.0.3
User4-192.168.0.4
使用方法:
パスを使用した場合は、uuman.shで次の変数を調整します。
# LOCAL="/root/uuman/log" # WORKD="/root/uuman"
セットアップスクリプトは、クライアントステーションで動作するプログラムに必要なパッケージをインストールします。 スクリプトを使用するには、uuman.shファイルの行をコメントアウトします。
screen -A -m -d -S "upd$i" expect $WORKD/update $IP $USERN
そしてコメント解除:
#screen -A -m -d -S "upd$i" expect $WORKD/setup $IP
自動モード:
$WORKD/uuman.sh check
アップデートの可用性についてip.txtファイルからクライアントステーションをチェックします。
$WORKD/uuman.sh update
-ip.txtファイルからアクセス可能なクライアントステーションを更新します。
結果:
Ubuntu Linuxを実行しているクライアントステーションで、インストールされたプログラム、セキュリティパッケージ、および必要に応じて更新の関連性に関する情報を自動的または手動で受信、保存、処理するクライアントサーバーシステムを取得します。
UPD:
承認はssh-keyを介して行われます。
キーを生成する
ssh-keygen -t rsa
セットアップファイルを使用して、クライアントステーションに配置します。