カテゴリー : script

pppoe-serverでLAN型払い出しサービスを模擬するスクリプト

pppoe-serverでLAN型払い出しサービスを模擬するスクリプト

1. /etc/ppp/route.list を作成

# REMOTE_IP  PREFIX
172.17.1.254 24
172.17.2.254 24
172.17.3.254 24

2. /etc/ppp/ip-up.local を作成

#!/bin/sh

PPP_IF=$1
REMOTE_ADDR=$5
ROUTE_LIST=/etc/ppp/route.list
LOG_FILE=/var/log/pppoe_route.log
LANG=C
CUR_MONTH=$( date +%b )
CUR_DATE=$( date +%d )
CUR_TIME=$( date +%H:%M:%S )
NOW="${CUR_MONTH} ${CUR_DATE} ${CUR_TIME}"

if [ ! -f "${ROUTE_LIST}" ];then
   echo "${NOW} No such file: ${ROUTE_LIST}" >> ${LOG_FILE}
   exit 0
fi

while read list
do
   echo ${list} | grep ^[1-9] > /dev/null
   if [ $? -eq 0 ];then
      GET_ADDR=$( echo ${list} | awk '{ print $1 }' )
      if [ "${REMOTE_ADDR}" = "${GET_ADDR}" ];then
         PREFIX=$( echo ${list} | awk '{ print $2 }' )
         if [ "${PREFIX}" -lt 32 ];then
            NETWORK=$( ipcalc ${GET_ADDR}/${PREFIX} -n | awk -F'=' '{ print $2}' )
            echo "${NOW} ADD ${NETWORK}/${PREFIX} gw ${PPP_IF}" >> ${LOG_FILE}
            route add -net ${NETWORK}/${PREFIX} dev ${PPP_IF} > /dev/null
         fi
      fi
   fi
done<${ROUTE_LIST}

3. /etc/ppp/ip-down.local を作成

#!/bin/sh

PPP_IF=$1
REMOTE_ADDR=$5
ROUTE_LIST=/etc/ppp/route.list
LOG_FILE=/var/log/pppoe_route.log
LANG=C
CUR_MONTH=$( date +%b )
CUR_DATE=$( date +%d )
CUR_TIME=$( date +%H:%M:%S )
NOW="${CUR_MONTH} ${CUR_DATE} ${CUR_TIME}"

if [ ! -f "${ROUTE_LIST}" ];then
   echo "${NOW} No such file: ${ROUTE_LIST}" >> ${LOG_FILE}
   exit 0
fi

while read list
do
   echo ${list} | grep ^[1-9] > /dev/null
   if [ $? -eq 0 ];then
      GET_ADDR=$( echo ${list} | awk '{ print $1 }' )
      if [ "${REMOTE_ADDR}" = "${GET_ADDR}" ];then
         PREFIX=$( echo ${list} | awk '{ print $2 }' )
         if [ "${PREFIX}" -lt 32 ];then
            NETWORK=$( ipcalc ${GET_ADDR}/${PREFIX} -n | awk -F'=' '{ print $2}' )
            echo "${NOW} DELETE ${NETWORK}/${PREFIX} gw ${PPP_IF}" >> ${LOG_FILE}
            route del -net ${NETWORK}/${PREFIX} dev ${PPP_IF} > /dev/null
         fi
      fi
   fi
done<${ROUTE_LIST}

4. ip-up.local と ip-down.local に実行権を与える

# chmod +x /etc/ppp/ip-up.local
# chmod +x /etc/ppp/ip-down.local

端末型払い出しのルーティングテーブル

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 ppp0

LAN型払い出しのルーティングテーブル

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 ppp0
172.17.1.254    0.0.0.0         255.255.255.255 UH    0      0        0 ppp0

CentOS 6 に mcrypt.so を組み込む方法 (source)

CentOS 6 に mcrypt.so を組み込む方法は以下の通り。

1. 必要なパッケージをインストール

# yum -y install php-devel gcc gcc-c++ make

2. 共有ライブラリのパスを追加

# vi /etc/ld.so.conf.d/usr_local_lib.conf
/usr/local/lib

3. 次の URL から mhash をダウンロード

# cd /usr/local/src/

http://mhash.sourceforge.net/

4. 展開とインストール

# tar xvjf mhash-0.9.9.9.tar.bz2
# cd mhash-0.9.9.9
# ./configure && make && make install
# ldconfig
# cd -

5. 次の URL から libmcrypt をダウンロード

http://sourceforge.net/projects/mcrypt/files/Libmcrypt/

6. 展開とインストール

# tar jxvf libmcrypt-2.5.8.tar.bz2
# cd libmcrypt-2.5.8
# ./configure && make && make install
# ldconfig
# cd -

7. 次の URL から php をダウンロード

http://php.net/downloads.php

8. 展開とモジュールのインストール

# tar xvjf php-5.3.10.tar.bz2
# cd php-5.3.10/ext/mcrypt/
# phpize
# aclocal
# ./configure && make && make install

コンパイルエラーが発生した。

mcrypt.c:283: error: ‘PHP_FE_END’ undeclared here (not in a function)
make: *** [mcrypt.lo] エラー 1

283行目を修正

# vi mcrypt.c
//PHP_FE_END
 {NULL,NULL,NULL}

リトライ

# ./configure && make && make install

9. モジュールの組み込み

# vi /etc/php.d/mcrypt.ini
extension=mcrypt.so

環境:
CentOS 6.2 (x86_64)
php-5.3.3-3
mhash-0.9.9.9
libmcrypt-2.5.8
gcc-4.4.6-3
gcc-c++-4.4.6-3

CentOS 6 に mcrypt.so を組み込む方法 (rpm)

CentOS 6 に mcrypt.so を組み込む方法 は以下の通り。

次のファイルをすべてダウンロードしてインストール

php-mcrypt-5.3.3-1.el6.x86_64.rpm
libmcrypt-2.5.8-9.el6.x86_64.rpm
libmnetutil-0.8.0-0.2.20100629svn3775.el6.x86_64.rpm
libmutil-0.8.0-0.3.20100319svn3760.el6.x86_64.rpm
udns-0.0.9-5.el6.x86_64.rpm

環境:
CentOS 6.2 (x86_64)
php-5.3.3-3

expect サンプル

#! /usr/bin/expect
set timeout 10
log_file expect.log
spawn telnet 192.168.1.1
expect "login:"
send "rootr"
expect "Password:"
send "password\r"
expect "~]#"
puts "\r"
puts "################"
puts "#  expect test #"
puts "################"
send "ls -l\r"
expect "~]#"
send "exit\r"
#! /bin/sh
expect -c "
set timeout 10
log_file expect.log
spawn telnet 192.168.1.1
expect \"login:\"
send \"root\r\"
expect \"Password:\"
send \"password\r\"
expect \"~]#\"
puts \"\r\"
puts \"################\"
puts \"#  expect test #\"
puts \"################\"
send \"ls -l\r\"
expect \"~]#\"
send \"exit\r\"
"

Net_LDAP2 を使って LDAP エントリを変更する方法

Net_LDAP2を使ってLDAPエントリを変更する方法は以下の通り。

【例】user01のsambaPwdLastSetを今の時刻に変更

<?php

require_once 'Net/LDAP2.php';

$bindDn   = 'cn=Manager,dc=example,dc=com';
$bindPw   = 'password';
$ldapHost = '192.168.1.101';
$ldapPort = 389;
$baseDn   = 'dc=example,dc=com';

$config = array (
 'binddn' => $bindDn,
 'bindpw' => $bindPw,
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage());
}

$dn    = 'uid=user01,ou=Users,dc=example,dc=com';
$entry = $ldap->getEntry($dn);
$entry->replace(array('sambaPwdLastSet' => time()));
$entry->update();

?>

Net_LDAP2 を使って LDAP エントリを削除する方法

Net_LDAP2を使ってLDAPエントリを削除する方法は以下の通り。

【例】user01を削除

<?php

require_once 'Net/LDAP2.php';

$bindDn   = 'cn=Manager,dc=example,dc=com';
$bindPw   = 'password';
$ldapHost = '192.168.1.101';
$ldapPort = 389;
$baseDn   = 'dc=example,dc=com';

$config = array (
 'binddn' => $bindDn,
 'bindpw' => $bindPw,
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage());
}

$dn    = 'uid=user01,ou=Users,dc=example,dc=com';
$entry = $ldap->getEntry($dn);
$entry->delete();
$entry->update();

?>

Net_LDAP2 を使って LDAP エントリを登録する方法

Net_LDAP2を使ってLDAPエントリを登録する方法は以下の通り。

【例】samba用の新規アカウントuser01を登録
※sambaパスワードとuserパスワード、表示名は全て usre01

<?php

require_once 'Net/LDAP2.php';

$bindDn    = 'cn=Manager,dc=example,dc=com';
$bindPw    = 'password';
$ldapHost  = '192.168.1.101';
$ldapPort  = 389;
$baseDn    = 'dc=example,dc=com';

$attrs           = array();
$uid             = 'user01';
$addDn           = 'uid=' . $uid . ',ou=Users,' . $baseDn;
$loginShell      = '/bin/bash';
$homeDirectory   = '/home/' . $uid;
$sambaPwdLastSet = time();
$sambaAcctFlags  = '[U          ]';
$objectClass     = array('account', 'posixAccount', 'sambaSamAccount');

$sambaPasswordHistory = '';
$userPassword = '';
$sambaNTPassword = '';
$uidNumber    = '';
$gidNumber    = '';
$userSID      = '';

for ($i = 0; $i < 64; $i++) {
 $sambaPasswordHistory .= '0';
}

$salt = sha1(rand());
$salt = substr($salt, 0, 4);
$hash = base64_encode( sha1($uid . $salt, true) . $salt );
$userPassword = '{SSHA}' . $hash;
$sambaNTPassword = hash('md4',mb_convert_encoding($uid, "UCS-2LE", "utf-8"));;

$config = array (
 'binddn' => $bindDn,
 'bindpw' => $bindPw,
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage());
}

$dn        = 'ou=Idmap,dc=example,dc=com';
$entry     = $ldap->getEntry($dn);
$uidNumber = $entry->getValue('uidNumber', 'single');
$entry->replace(array('uidNumber' => $uidNumber + 1));
$entry->update();

$dn        = 'cn=domusers,ou=Groups,dc=example,dc=com';
$entry     = $ldap->getEntry($dn);
$gidNumber = $entry->getValue('gidNumber', 'single');

$dn            = 'sambaDomainName=EXAMPLE,dc=example,dc=com';
$entry         = $ldap->getEntry($dn);
$sambaSID      = $entry->getValue('sambaSID', 'single');
$sambaNextRid  = $entry->getValue('sambaNextRid', 'single') + 1;
$userSID       = $sambaSID . '-' . $sambaNextRid;
$entry->replace(array('sambaNextRid' => $sambaNextRid));
$entry->update();

$attrs = array(
 'objectClass'          => $objectClass,
 'cn'                   => $uid,
 'uid'                  => $uid,
 'uidNumber'            => $uidNumber,
 'gidNumber'            => $gidNumber,
 'loginShell'           => $loginShell,
 'homeDirectory'        => $homeDirectory,
 'displayName'          => $uid,
 'userPassword'         => $userPassword,
 'sambaSID'             => $userSID,
 'sambaAcctFlags'       => $sambaAcctFlags,
 'sambaPasswordHistory' => $sambaPasswordHistory,
 'sambaPwdLastSet'      => $sambaPwdLastSet,
 'sambaNTPassword'      => $sambaNTPassword
);

$entry = Net_LDAP2_Entry::createFresh($addDn, $attrs);

$ldap->add($entry);
if (Net_LDAP2::isError($ldap)) {
 die('ユーザーの登録に失敗しました:' . $ldap->getMessage());
}

?>

Net_LDAP2 を使って LDAP エントリの属性値を取得する方法

Net_LDAP2を使ってLDAPエントリの属性値を取得する方法は以下の通り。

【例】user01のuidNumberとuserPasswordを取得

<?php

require_once 'Net/LDAP2.php';

$bindDn   = 'cn=Manager,dc=example,dc=com';
$bindPw   = 'password';
$ldapHost = '192.168.1.101';
$ldapPort = 389;
$baseDn   = 'dc=example,dc=com';
$dn       = 'uid=user01,ou=Users,dc=example,dc=com';

$config = array (
 'binddn' => $bindDn,
 'bindpw' => $bindPw,
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage());
}

$entry = $ldap->getEntry($dn);
$uidNumber = $entry->getValue('uidNumber', 'single');
$userPassword = $entry->getValue('userPassword', 'single');
echo 'uidNumber: ' . $uidNumber . "n";
echo 'userPassword: ' . $userPassword . "n";

?>

Net_LDAP2 を使って LDAP エントリの属性値を取得する方法(匿名)

Net_LDAP2を使ってLDAPエントリの属性値を匿名で取得する方法は以下の通り。

【例】user01のuidNumberを取得

<?php

require_once 'Net/LDAP2.php';

$ldapHost = '192.168.1.101';
$ldapPort = 389;
$baseDn   = 'dc=example,dc=com';
$dn       = 'uid=user01,ou=Users,dc=example,dc=com';

$config = array (
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage());
}

$entry = $ldap->getEntry($dn);
$uidNumber = $entry->getValue('gidNumber', 'single');
echo 'uidNumber: ' . $uidNumber . "n";

?>

Net_LDAP2 を使って LDAP エントリを検索する方法

Net_LDAP2を使ってLDAPエントリを検索する方法は以下の通り。

<?php

require_once 'Net/LDAP2.php';

$bindDn   = 'cn=Manager,dc=example,dc=com';
$bindPw   = 'password';
$ldapHost = '192.168.1.101';
$ldapPort = 389;
$baseDn   = 'ou=Users,dc=example,dc=com';

$config = array (
 'binddn' => $bindDn,
 'bindpw' => $bindPw,
 'basedn' => $baseDn,
 'port'   => $ldapPort,
 'host'   => $ldapHost
);

$ldap = Net_LDAP2::connect($config);

if (PEAR::isError($ldap)) {
 die('LDAPサーバに接続できませんでした:' . $ldap->getMessage() . "n");
}

$filter0 = Net_LDAP2_Filter::create('uidNumber', 'any', 'ANY');
$filter_Admin = Net_LDAP2_Filter::create('uid', 'equals', 'administrator');
$filter_not_Admin = Net_LDAP2_Filter::combine('not', $filter_Admin);
$filter_Guest = Net_LDAP2_Filter::create('uid', 'equals', 'guest');
$filter_not_Guest = Net_LDAP2_Filter::combine('not', $filter_Guest);
$filter = Net_LDAP2_Filter::combine('and',array($filter0, $filter_not_Admin, $filter_not_Guest));

$attrs = array('uid', 'uidNumber');

$options = array(
 'scope' => 'sub',
 'attributes' => $attrs
);

$search = $ldap->search($baseDn, $filter, $options);
if (PEAR::isError($search)) {
 die('LDAP検索に失敗しました: ' . $search->getMessage() . "n");
}
echo $search->count() . "エントリみつかりましたn";

foreach ($search as $dn => $entry) {
 echo 'DN: ' . $dn . "n";
 echo 'uidNumber: ' . $entry->getValue('uidNumber') . "n";
}

?>
if (PEAR::isError($search)) {
    die($search->getMessage() . "n");
}
TOP

INFORMATION

当サイトは備忘録であり、その内容を保証するものではありません。 当サイトまたはリンク先によるいかなるトラブルや損害に関しても、一切の責任を負いかねます。 当サイトの内容を無断で転用したり、転載する等の行為はおやめください。