Press "Enter" to skip to content

[월:] 2019년 07월

[호스팅 구축] 쉘 스크립트

#!/bin/bash
echo "
               [1] 사용자 계정 추가 합니다.
               
               [2] 네임서버 추가합니다. 
               
               [3] VirtualHost 추가하기.                

               [4] Mysql 계정추가하기.
              
               [5] sendmail 계정 추가하기.  
"

echo -n "select Number:"
read Num

case "$Num" in

#사용자 추가 하기 
1)
echo =======================================================
echo
echo  "< Hosting Server 사용자 추가 스크립트>"
echo
echo  계정ID, 계정Password 를 입력       
echo
echo =======================================================
echo 
echo -n "사용자 계정 입력:"
         read id

echo -n "사용자 패스워드 입력:"
         read pass

echo -n "
        사용자 계정: $id
        
        사용자패스워드: $pass
-------------------------------------------------------------
        맞으면 <Enter>를 누르고 틀리면 No를 입력하세요: "
        read chk

if [ "$chk" != "" ]

then
         exit
fi

echo""
echo "호스팅 사용자를 추가합니다."

#계정 ID 추가 
adduser $id
#패스 워드 추가

echo "$pass" | passwd --stdin "$id"
echo "

"
echo "사용자 아이디와 패스워드 입니다"
echo ""
echo ""
echo "사용자 ID: $id"
echo "패스워드 : $pass"
echo "사용자 추가를 완료했습니다"
exit;;

#네임 서버 추가 스크립트
2)
echo =======================================================
echo
echo  "< 네임서버 추가 등록추가 >"
echo
echo =======================================================
echo 
echo -n "url 주소를 입력하세요 :"
         read url

echo -n "서버 IP 입력하세요:"
         read ip
echo -n "
       
        사용자 도메인 : $url
          서버 IP     : $ip
-------------------------------------------------------------
        맞으면 <Enter>를 누르고 틀리면 No를 입력하세요: "
        read chk

if [ "$chk" != "" ]

then
         exit
fi

echo "zone \"$url\" IN {
        type master;
        file \"$url.zone\";
        allow-update { none; };
};" >> /etc/named.conf

#포워드존 파일 생성합니다 
touch /var/named/$url.zone

echo "\$TTL    86400
@       IN      SOA     ns.$url. root.ns.$url.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
                IN      NS      ns.$url.
                IN      MX 10   mail.$url.
;
@               IN      A       $ip
www             IN      A       $ip
*               IN      A       $ip
" > /var/named/$url.zone

#named restart
/etc/init.d/named restart

echo "설정이  완료했습니다"

exit;;

# 가상호스트 추가하기

3)

echo =======================================================
echo
echo  "< 가상 호스트 추가하기 >"
echo
echo  계정 도메인, 계정ID, IP는 *:80 을 입력   
echo
echo =======================================================
echo 
echo -n "url 주소를 입력하세요 :"
         read url
echo -n "계정 ID를 입력 하세요:"
         read id
echo -n "서버 IP 입력하세요:"
         read ip
echo -n "
       
        사용자 도메인 : $url
            게정 ID   : $id
            서버 IP   : $ip

-------------------------------------------------------------
        맞으면 <Enter>를 누르고 틀리면 No를 입력하세요: "
        read chk

if [ "$chk" != "" ]

then
         exit
fi

echo "<VirtualHost $ip>
DocumentRoot /home/$id/public_html
ServerName $url
ServerAlias www.$url
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>" >> /etc/httpd/conf/httpd.conf

echo "설정이  완료했습니다"

#아파치 restart
service httpd restart

exit;;

# Myslq 계정 추가하기 
4)
echo =======================================================
echo
echo  "< Myslq 계정 추가하기  >"
echo
echo  계정ID, MySql Password를 입력
echo
echo =======================================================
echo 
echo -n "Mysql 계정 추가하기:" 
         read id

echo -n "Mysql 패스워드 :"
         read pass
echo -n "
       
        사용자 도메인 : $id
            서버 IP   : $pass

-------------------------------------------------------------
        맞으면 <Enter>를 누르고 틀리면 No를 입력하세요: "
        read chk

if [ "$chk" != "" ]

then
           exit
fi

echo "create database $id;
GRANT ALL PRIVILEGES ON $id.* TO $id@localhost IDENTIFIED by '$pass';" > ./tmp

echo "
       Mysql 루트 패스워드를 입력하세요    
"

mysql -u root -p mysql < ./tmp
rm -f ./tmp

echo "설정이  완료했습니다"
exit;;

5)
echo =======================================================
echo
echo       메일 추가하기        
echo
echo       계정 도메인, 메일ID, 메일Password 를 입력
echo
echo =======================================================
echo -n "url 주소를 입력하세요 :"
         read url
echo -n "계정 ID:"
         read id
echo -n "계정 패스워드:" 
         read pass
echo -n "
       
        사용자 도메인 : $url
            계정 ID   : $id
            서버 PASS : $pass
        
-------------------------------------------------------------
        맞으면 <Enter>를 누르고 틀리면 No를 입력하세요: "
        read chk
if [ "$chk" != "" ]
then
           exit
fi
echo "$url" >> /etc/mail/local-host-names

adduser -M $id -s /bin/false

echo "$id@$url  $id"  >> /etc/mail/virtusertable
echo "$pass" | passwd --stdin "$id"

#sendmail 설정 적용을 위한 메일 DB작업 
makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
makemap hash /etc/mail/local-host-names < /etc/mail/local-host-names

#sendmail restart
/etc/init.d/sendmail restart

echo "설정이  완료했습니다"
exit;;*)
  .....
esac




==================================================================
또 다른 방법
==================================================================



아래 세가지가 있는데, 쉘스크립트를 조금만 아시는 분이라면 
소스만 보셔두 충분 할 것입니다. 
잘 모르신다면 설명과 함께 스크린샷도 같이 보시면 좋습니다. 
주의 하실 점은 레드헷 기반에서 작업하였고, 아파치는 /usr/local/apache에 
설치 되었었고, /usr/local/mysql 에 mysql이 설치 되었으며, 
dns는 /etc/named.conf 파일과 /var/named 아래디렉토리를 수정하고 
있습니다. 
이러한 부분들은 자신의 시스템에 맞춰서 설정하신후에 사용하시면 
됩니다. 
마지막으로 아래 쉘 스크립트들은 아주 간단한 문법으로 echo문이나 
간단한 메뉴 구성으로 만들어져 있으므로, 여러분이 직접 수정 보완하여서 
사용하실때 더 빛을 볼꺼라고 생각합니다^^

소스 

#!/bin/sh 
#
# P-Server Manager -- pbi12
# usage : P-Menu Setting-ID
#

echo 
echo http://linuxnew.com Made by Pbi12...
echo
echo "[ P-Server Manager ]" 
echo

select var in "useradd" "userdel" "public_html" "chmod" "db-creat" "db-drop" "db-privilege" "db-delete" "db-backup" "db-reload" "du" "exit"

do 
if [ "$var" = "useradd" ]; then 
echo "Add $1 Account~" 
/usr/sbin/useradd $1 -g other
passwd $1

elif [ "$var" = "userdel" ]; then 
echo "$1 User Delete!" 
/usr/sbin/userdel -r $1

elif [ "$var" = "public_html" ]; then 
echo "Make Web Derectory" 
mkdir /home/$1/public_html

elif [ "$var" = "chmod" ]; then 
echo "Setting public_html" 
chmod 711 /home/$1/
chmod 711 /home/$1/public_html

elif [ "$var" = "db-creat" ]; then 
echo "DB-Creat"
/usr/local/mysql/bin/mysqladmin -uroot -p create $1

elif [ "$var" = "db-drop" ]; then 
echo "DB-Drop"
/usr/local/mysql/bin/mysqladmin -uroot -p drop $1

elif [ "$var" = "db-privilege" ]; then 
echo "grant all privileges on N.N to $1@localhost identified by '암호' with grant option; INSERT INTO db VALUES('localhost', '$1', '$1','Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); "
/usr/local/mysql/bin/mysql -u root -p mysql

elif [ "$var" = "db-delete" ]; then 
echo "DELETE FROM user where user='$1'; DELETE FROM db where user='$1';"
/usr/local/mysql/bin/mysql -u root -p mysql

elif [ "$var" = "db-backup" ]; then 
echo "DB-Backup"
/usr/local/mysql/bin/mysqldump -u$1 -p $1 > $1.sql

elif [ "$var" = "db-reload" ]; then 
echo "DB-Reload"
/usr/local/mysql/bin/mysqladmin -uroot -p reload

elif [ "$var" = "du" ]; then 
echo "Du State"
du -sh /home/*

elif [ "$var" = "exit" ]; then 
echo "Thank you^^" 
exit 0

else 
echo "$var Re Selecte" 
fi 
done

이 프로그램은 인수로 아이디를 받습니다. 
그런후에 그 아이디에 맞춰서 작업을 합니다. 
메뉴는 12개가 있는데, 제가 계정을 주거나 DB를 새로 생성하거나 자주 사용하는 것들을 
이렇게 메뉴로 만들어 놓고서 계정을 줄때에 사용합니다. 
대충 살펴 보면 

[ P-Server Manager ] 
1) useradd 4) chmod 7) db-privilege 10) db-reload 
2) userdel 5) db-creat 8) db-delete 11) du 
3) public_html 6) db-drop 9) db-backup 12) exit

[ P-Server Manager ] 
1) useradd 4) chmod 7) db-privilege 10) db-reload 
2) userdel 5) db-creat 8) db-delete 11) du 
3) public_html 6) db-drop 9) db-backup 12) exit

계정을 생성하고 삭제하고 public_html 을 주고 퍼미션 조절하고, db생성하고, db계정도 생성을 합니다. 
db권한을 줄때에는 복사해서 붙여넣기 할 수 있도록 echo만 되어집니다. 
mysql 리로드 하고, du 로 /home 아래 에 있는 계정 사용자들의 
현재 사용 용량도 확인을 합니다. 
12번을 눌러서 exit 종료~ 
제가 개인적으로 서버 관리 할때에 사용하는 건데, 참고하세요^^

소스 

#/bin/sh
#
# $1 is acount name, $2 is domain name.!
# Domain Setting...
# Virtual Host Add acount Shell Program!
#
[ $# -ne 2 ] &&
{
echo
echo ===================================================
echo
echo P-Domain http://linuxnew.com Made by Pbi12...
echo
echo usage : $0 Setting-ID Setting-Domain
echo
echo ex. P-Domain pbi12 linuxnew.com
echo
echo ===================================================
echo
exit 1
}

if [ $2 != NULL ]; then
adduser $1 -g other
passwd $1
chmod 711 /home/$1

echo "
<VirtualHost 211.113.242.26>
ServerName $2
DocumentRoot /home/$1/public_html/
ServerAlias www.$2
</VirtualHost> " >> /usr/local/apache/conf/httpd.conf

echo "
zone \"$2\" IN {
type master;
file \"db.$2\";
};" >> /etc/named.conf

echo "
@ IN SOA ns.linuxnew.com. root.linuxnew.com. (
2001122600 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum

IN NS ns.linuxnew.com.

localhost IN A 127.0.0.1
@ IN A 211.113.242.26
ns IN A 211.113.242.26
www IN A 211.113.242.26
" > /var/named/db.$2

/usr/local/apache/bin/apachectl restart
/etc/init.d/named restart

echo
echo "########################################################"
echo
echo "[P-VirtualHost] '$1'의 가상 도메인을 셋팅하였습니다."
echo "Apache 와 Dns를 재가동 시켰습니다."
echo "'$2'도메인으로 접속하세요!"
echo "http://linuxnew.com -- Made by pbi12"
echo
echo "########################################################"
echo
fi

이건 P-VirtualHost 하고 거의 흡사 한건데, 이건 도메인을 새로 사서 등록하고, 
DNS를 셋팅할때에 이걸로 하는데, 사용법은 
프로그램이름 적고 생성할 아이디 적고 셋팅할 도메인을 적어주면, 
아이디는 -g other 그룹으로 생성을 하고, 퍼미션 조절을 해준다음에 
그 다음에는 dns 셋팅을 해주고, 
dns의 db파일을 생성해주고, 그리고 나서 아파치에서 가상 호스트 셋팅을 해줍니다. 
마지막으로 named와 apache를 재가동 시켜줍니다. 
도메인을 새로 만든 계정에 연결을 해주는 것으로 바로 도메인을 치면 연결이 됩니다~ 
여러도메인을 연결해주고 있는 저는 이것을 사용해서 한번에 셋팅을 해주고 있습니다.^^;

소스 

#/bin/sh
#
# $1 is acount name ...
# Virtual Host Add acount Shell Program!
#
[ $# -ne 1 ] &&
{
echo
echo ===================================================
echo
echo P-Virtual http://linuxnew.com Made by Pbi12...
echo
echo usage : $0 Setting-ID
echo
echo ===================================================
echo
exit 1
}

if [ $1 != NULL ]; then

adduser $1 -g other
passwd $1
chmod 711 /home/$1

echo "
<VirtualHost 211.113.242.26>
ServerName $1.linuxnew.com
DocumentRoot /home/$1/public_html/
</VirtualHost> " >> /usr/local/apache/conf/httpd.conf

echo "$1 IN A 211.113.242.26" >> /var/named/db.linuxnew.com

/usr/local/apache/bin/apachectl restart
/etc/init.d/named restart

echo
echo "########################################################"
echo
echo "[P-VirtualHost] '$1'의 가상 도메인을 셋팅하였습니다."
echo "Apache 와 Dns를 재가동 시켰습니다."
echo "http://linuxnew.com -- Made by pbi12"
echo
echo "########################################################"
echo
fi


쉘프로그램인데, 제가 제 시스템에서 새로운 계정을 만들때에 사용하는 것으로 
계정은 -g 옵션으로 other 그룹으로 생성합니다. 
그리고 dns와 apache를 셋팅해서 2차 도메인을 만들때에 사용하는 것으로 한번에 계정 생성하고, 
퍼미션 조절해주고, httpd.conf에 가상호스트 추가해주고, dns 셋팅해주고, 마지막에 재가동 시켜 줍니다. 
아래에 링크 시켜놨으니깐 참고하세요~

출처 : linux.co.kr
작성자 : pbi12@yahoo.co.kr


사용자 계정 추가 쉘 스크립트

사용법

 /root/script/newuser 사용자ID

소스

#!/bin/bash

clear

echo ==================================================================
echo " UserAdd Process Start "
echo ==================================================================

echo -n "User Name : "
read username

useradd $username

echo ------------------------
echo PassWord Setting
echo ------------------------
passwd $username

echo ==================================================================
echo " www root directory making "
echo ==================================================================

echo
echo -n "www root Directory path : "
echo /home/$username/public_html
mkdir -p /home/$username/public_html
echo ==================================================================
echo " root directory setting & test index.php making "
echo ==================================================================
chmod 775 /home/$username
chmod 775 /home/$username/public_html
chown $username.$username /home/$username/public_html

echo " " >>/home/$username/public_html/index.php
echo "<? phpinfo(); ?>" >> /home/$username/public_html/index.php

chown $username.$username /home/$username/public_html/index.php
chmod 775 /home/$username/public_html/index.php

echo checking -----------------------------------------------------------
ls -al /home/$username
echo checking -----------------------------------------------------------
ls -al /home/$username/public_html

echo ==================================================================
echo " MySQL useradd"
echo ==================================================================
echo "Username : $username"
echo "dbname : $username"
echo -n "User p/w : "
read userpw
echo " " >> mysql_useradd.sql
echo "use mysql" >> mysql_useradd.sql
echo "create database $username;" >> mysql_useradd.sql
echo "insert into user (host, user, password) values ('localhost', '$username', password('$userpw'));" >> mysql_useradd.sql
echo "insert into db values ('localhost', '$username', '$username', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');" >> mysql_useradd.sql
echo "FLUSH PRIVILEGES;" >> mysql_useradd.sql
/usr/local/mysql/bin/mysql -uroot -p97081056 < ./mysql_useradd.sql
cat ./mysql_useradd.sql
rm -rf ./mysql_useradd.sql

[호스팅 구축] 계정등록 절차 스크립트

웹호스팅 계정등록 절차

  • 현재 임시로 구현된 계정등록 스크립트를 이용할 때의 절차이며, 추후 계정생성 기능도 스크립트에 통합시켜서 좀더 단순화 할 예정이다.
  • 본 절차는 아래 서버호스팅 설정내용을 기초로 한 내용이므로 서버의 네임서버나 웹서버의 설정이 다른 경우 제대로 동작하지 않을 수 있다.

1. 웹호스팅 계정생성

[root@localhost ~]# useradd -g users guest1 //--> guest1 계정 생성
[root@localhost home]# chmod 701 /home/guest1/ //--> 계정 www 디렉토리의 웹접근 허용을 위한 작업

2. 웹호스팅 계정등록 스크립트 실행

[root@suware admin]# ./vhost.sh
echo -n "User Name : "
read username

echo -n "Web address : "
read webaddr

echo "Username : $username"
echo "Web address : $webaddr"

vhost_dir="/usr/local/apache2/conf/extra/httpd-vhosts.conf"
name_dir="/etc/named.external.zones"

# 아파치 .conf 파일에 가상호스트 부분을 추가함
echo "" >> $vhost_dir
echo "" >> $vhost_dir
echo "    ServerAdmin admin@mymail.com" >> $vhost_dir
echo "    DocumentRoot \"/home/$username/www\"" >> $vhost_dir
echo "    ServerName $webaddr" >> $vhost_dir
echo "    ServerAlias *.$webaddr" >> $vhost_dir
echo "    " >> $vhost_dir
echo "     Options IncludesNoExec" >> $vhost_dir
echo "    " >> $vhost_dir
echo "" >> $vhost_dir

# 네임서버 zone 파일에 도메인 추가함
echo "zone \"$webaddr\" IN {     type master; file \"general.zone\"; allow-update { none; }; };" >> $name_dir

echo "1)APACHE restarting..."
service httpd restart

echo "2)Name Server restarting..."
/etc/init.d/named restart


출처 : http://sharpwork.pe.kr/bbs/board.php?folder=&bo_table=linux&page=1&bbs_id=3023

소스 분석 도구 ctags 사용법

소스 자료 수집

# ctags -R 

vi에서 사용되는 ctags 커맨드

Ctrl+] 함수가 정의된 파일로 이동 
Ctrl+t 이동하기 전 단계의 위치로 이동
:tselect 같은 이름의 function-name이 여러개 일때, 목록을 보여준다. 번호를 이용해서 선택할 수 있다
:tnext 여러개의 함수이름이 존재할 때, 다음 함수를 선택한다.
:tprevious 이전 함수를 선택한다.
:tfirst 가장 처음에 찾았던 함수를 선택한다.
:tlast 가장 마지막 함수를 선택한다.

ps 명령어로 나오는 프로세스의 상태코드

ps 명령어를 사용하면 프로세스의 상태를 알 수 있는데, 코드로 되어 있다. ㅡㅡ;;;;
코드의 의미를 알아보자. 

man ps 명령어를 실행 하면 PROCESS STATE CODES 항목에서 의미를 알 수 있다.
근데 피부에 확 와닿지는 않네. ㅠㅠ 대충 해석해 볼란다. 틀려도 믿지 말아라…. 책임 안진다잉~

PROCESS STATE CODES
       Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
       D    uninterruptible sleep (usually IO) : 종료되지 않는 대기(일반적인 입출력)
       R    running or runnable (on run queue) : 실행중 혹은 실행대기
       S    interruptible sleep (waiting for an event to complete) : 중지될 수 있는 대기(완료 이벤트를 기다리는 중)
       T    stopped, either by a job control signal or because it is being traced. : 중지됨, 작업 컨트롤 시그널 혹은 traced
       W    paging (not valid since the 2.6.xx kernel) : 페이징(커널 2.6.xx이후로 유효하지 않음)
       X    dead (should never be seen) : 죽었다..(볼일이 없어야 한다)
       Z    defunct ("zombie") process, terminated but not reaped by its parent. : 좀비 프로세스, 종료되었지만 부모 프로세스가 뒷처리를 하지 않은 경우

       For BSD formats and when the stat keyword is used, additional characters may be displayed: BSD 포맷에서는 다음 문자가 나올 수도 있다.
       <    high-priority (not nice to other users) : 고 우선순위
       N    low-priority (nice to other users) : 저 우선순위
       L    has pages locked into memory (for real-time and custom IO) : 메모리로 페이지가 잠겨??? 뭔소링경
       s    is a session leader : 세션 리더???? 뭐냥??
       l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) : 멀티 쓰레드
       +    is in the foreground process group. : 포그라운드 프로세스 그룹(한글로 소리나는 대로 썻넹.... ㅡㅡ;;)

^M 을 한방에 없애보자…

^M이 뭔소린가 하는 분도 있을 것이다.

도스(윈도우)에서 텍스트 파일을 만들어서 유닉스 계열의 OS에서 읽으면 라인 맨 끝이 ^M이 하나식 붙는다.

눈에 거슬리는 거 빼면 그냥 텍스트 읽는 거에는 문제가 되지 않는다만, 이게 소스 일경우에는 문제가 커진다.

컴파일러는 ^M을 만나는 족족 에러로 뱉어주시기 때문이다.

어떻게 해결할까….

vi를 사용할 경우… 

vi 에서 Esc키를 눌러 명령 모드로 전환한 후, 다음 정규식으로 ^M을 치환한다.
복잡한 정규식은 아니고, 각행의 끝($)에 있는 ^M 기호를, 모두(g) 공백(//)으로 바꾸는(%s) 것이다.

:%s/^M$//g  

주의할 점은 ^M 을 키보드로 치면 안된다. 특수문자이기 때문에 Ctrl+V, M 키를 눌러서 입력해야 한다. 
Ctrl키를 누른 상태에서 v, m 이라는 2글자를 소문자로 연속으로 입력하면 된다.

안되면… ㅡㅡ;;;;;

쉘에서 dost2unix라는 유틸을 사용해 보자.

dost2unix <input.txt> output.txt  

input.txt에서 ^M 다 떼어네 output.txt로 만들어 준다.

얼라려? 그런데 또 이놈이 설치가 안되어 있는 경우도 있다. 헐~~~

sudo apt-get install dos2unix  

요렇게 설치하면 된다.