Рабочий форк Pac Manager

Ну вот, кто-то «подхватил» и продолжил наконец развивать заброшеный автором менеджер подключений Pac Manager. Ура товарищи. Ловите ссылку: https://www.asbru-cm.net/

В этой сборке исправлены ошибки работы под последними версиями Ubuntu, под которыми оригинальный Pac Manager без бубна уже не работал.

Клиент IRC сети на PHP

Задача: отправить сообщение абоненту сети IRC.

Решение: написал соответствующий класс. Исходники выложил на GitHub

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

class Tirc{
    var $debug=false;
    var $server="localhost";
    var $port=6667;    
    var $errno0;
    var $errstr="";
    var $timeout=10;
    var $socket;
    var $nick="noname";
    var $chanel="noname";
    
    /**
     *  Внутрення функция для логов
     */
    private function putlog($st){
        if ($this->debug==true) echo date("H-i-s")." : ".trim($st)."\n";
    }
    
    /**
     * Конструктор класса. Вызывается при создании экземпляра
     * @param type $server  - хост сервера
     * @param type $port    - порт сервера
     */
    function __construct($server, $port,$debug=false) {
            $this->server = $server;
            $this->port = $port;
            $this->debug=$debug;
            $this->putlog("лог в режиме DEBUG");
            $this->putlog("сервер $server, порт $port");
    }	    
    /**
     *  Соединение с сервером. Возврат - результат
     * @return type
     */
    function connect(){
        $this->putlog("пробуем соедениться с irc сервером");        
        $this->socket=stream_socket_client("tcp://$this->server:$this->port", $this->errno, $this->errstr,$this->timeout,STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
        $this->putlog("возврат: errno: $this->errno, errstr: $this->errstr, socket: $this->socket");              
        return $this->socket;        
    }
    /**
     * Разрыв соединения с сервером. Возврат - результат
     */
    function disconnect(){
        $this->putlog("пробуем закрыть соединение с сервером $this->socket");
        $ret=fclose($this->socket);
        $this->putlog("результат: $ret");
    }
    /**
     *  Послать команду серверу. Возврат false или количество посланый байт
     * @param type $command
     * @return type
     */
    function send($command){
        $this->putlog("пробуем послать команду сервер $command");
        $ret=fwrite($this->socket, $command);
        $this->putlog("результат: $ret");
        return $ret;
    }
    function Join($chanel){
        $this->chanel=$chanel;
        $res=$this->send("JOIN :#$chanel\r\n");        
        return $res;
    }
    function is_ping($line){         
        if(strstr($line, 'PING')) {
            $this->putlog("получен PING");
            return true;         
        }            
        
    }
    function pong(){         
        $this->send("PONG :".$this->server."\r\n");         
        $this->putlog("отправлен PONG");
    }    
    function is_msg($line){ 
        if(strstr($line, 'PRIVMSG')) return true;         
    }        
    function SetNick($nick){
        $this->nick=$nick;
        $ret=$this->send("NICK $nick\r\n");
        return $ret;
    }
    function User($name){        
        $ret=$this->send("USER $name $this->server bla :$name\r\n");        
        return $ret;
    }
    function listChans(){
        $this->send("LIST\r\n");         
    }    
    function sendmessage($target, $msg){ 
        $this->send("PRIVMSG $target :$msg\r\n");         
    }    
    function loop($onMessage){
        while (!feof($this->socket)) {
             $res = fgets($this->socket, 256); // ждем сообщений
             $onMessage($res);
             if($this->is_ping($res)) $this->pong();
        };
    }
}

Пример использования:

<?php

/* 
 * (с) 2018 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */

include_once 'irc_class.php';

$irc=new Tirc('ыкуаыукаыука',6667,true);
$irc->connect();
$irc->SetNick("каыукаы");
$irc->User("ыукаыукаыук");
$irc->Join("tviinet");
$irc->listChans();
$irc->loop("OnMessage");
$irc->disconnect();

function OnMessage($msg){
global $irc;
    var_dump(trim($msg));    
    if(strstr($msg,"PRIVMSG")){
        //получаю кто прислал сообщение?
        $ma=  explode("!",$msg);
        $user=  str_replace(":", "", $ma[0]);
        $irc->sendmessage("$user","Hello $user!");
    };
    //список пользователей канала
    if(strstr($msg,":$irc->server 353 $irc->nick = #$irc->chanel :")){
        $users_list=  str_replace(":$irc->server 353 $irc->nick = #$irc->chanel :", "", $msg);        
        //получаю список кто онлайн?
        $irc->send("ISON $users_list");
    };
    //кто онлайн?
    if(strstr($msg,":$irc->server 303 $irc->nick :")){
        $users_online_list= explode(" ",trim(str_replace(":$irc->server 303 $irc->nick :", "", $msg)));                
        //Всем кто онлайн, отправляем сообщения
        foreach ($users_online_list as $user) {
            $irc->sendmessage("$user","Hello $user!");
        }
    };
};

Ограничение пользователя SSH / SFTP домашним каталогом FreeBSD 10.4

Бывает ситуации, когда нужно дать доступ на сервер, но не желательно допустить, чтобы он видел «лишнее». Для этого можно ограничить пользователя домашним каталогом по ssh и sftp. Что нужно сделать для этого:

1) Создать пользователя:

root@w34rw34:~ # adduser test
Username: test
Full name: test test
Uid (Leave empty for default): 
Login group [test]: 
Login group is test. Invite test into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/test]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]: 
Username   : test
Password   : <random>
Full Name  : test test
Uid        : 1005
Class      : 
Groups     : test 
Home       : /home/test
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (test) to the user database.
adduser: INFO: Password for (test) is: 34rfw34rfw34
Add another user? (yes/no): no
Goodbye!

2)  В /etc/ssh/sshd_config добавляем следующие строчки:

Match user test
   ChrootDirectory /home/test

Перестартуем sshd:

/etc/rc.d/sshd restart

3) Ниже приведенным скриптом создадим «пользовательское окружение», т.е. фактически создадим набор команд шелла, доступных пользователю:

#!/bin/sh
 
# В скрипт нужно передавать имя пользователя для которого создаем chroot окружение
if [ "$1" = "" ] ; then
echo "    Usage: $0 [ username ]"
exit
fi
 
 
USER=$1
GID=`cat /etc/master.passwd | grep "^$USER:" | cut -d ":" -f 4`
HOME=/usr/home/$USER
 
# Задаем список бинаников, нужных для работы в chroot
 
BINS="
/usr/local/bin/mysql \
/bin/cat \
/bin/chmod \
/bin/cp \
/bin/csh \
/bin/date \
/bin/df \
/bin/echo \
/bin/expr \
/bin/ln \
/bin/ls \
/bin/mkdir \
/bin/mv \
/bin/ps \
/bin/pwd \
/bin/rm \
/bin/rmdir \
/bin/sh \
/usr/bin/awk \
/usr/bin/bzip2 \
/usr/bin/diff \
/usr/bin/du \
/usr/bin/ee \
/usr/bin/fetch \
/usr/bin/find \
/usr/bin/grep \
/usr/bin/gunzip \
/usr/bin/gzip \
/usr/bin/less \
/usr/bin/sed \
/usr/bin/sort \
/usr/bin/scp \
/usr/bin/ssh \
/usr/bin/tail \
/usr/bin/tar \
/usr/bin/touch \
/usr/bin/vi \
/usr/bin/uname \
/usr/bin/uptime \
/usr/local/bin/mc \
/usr/local/bin/mcedit \
/usr/local/bin/mcmfmt \
/usr/local/bin/unrar \
/usr/local/bin/unzip \

"
 
# Создаем структуру каталогов chroot окружения
mkdir $HOME/bin
mkdir $HOME/etc
mkdir $HOME/home
mkdir $HOME/home/$USER
mkdir $HOME/lib
mkdir $HOME/libexec
mkdir $HOME/tmp
mkdir $HOME/usr
mkdir $HOME/usr/bin
mkdir $HOME/usr/local
mkdir $HOME/usr/local/bin
mkdir $HOME/usr/local/etc
mkdir $HOME/usr/local/share
mkdir $HOME/lib
 
# Копируем бинарники в chroot окружение
for item in $BINS;
do
cp $item $HOME$item
done
 
# Копируем всю папку /lib
cp /lib/* $HOME/lib/
 
# Определяем какие библиотеки необходимо скопировать chroot
for item in $BINS;
do
ldd $item |awk '{print $3}'|grep "."  >> /tmp/libs
done
 
# Копируем библиотеки
for item in `cat /tmp/libs|sort|uniq`;
do
cp $item $HOME/lib/
done
 
# Копируем оставшиеся необходимые файлы и библиотеки
cp /etc/termcap $HOME/etc/termcap
cp /etc/resolv.conf $HOME/etc/resolv.conf
cp /etc/nsswitch.conf $HOME/etc/nsswitch.conf
cp -R /usr/local/share/mc $HOME/usr/local/share/mc
cp /libexec/ld-elf.so.1 $HOME/libexec/ld-elf.so.1
 
 
# Создадим /etc/motd для пользователя  
echo "Welcome $USER" > $HOME/etc/motd
 
# Теперь /etc/profile для него же
echo 'export TERMCAP=/etc/termcap' > $HOME/etc/profile
echo 'export PS1="$ "' >> $HOME/etc/profile
 
# /etc/group тоже нужен свой
cat /etc/group | grep $GID > $HOME/etc/group
 
# Теперь внутри chroot создадим пользователя
cat /etc/master.passwd|grep "^$USER:" > $HOME/etc/master.passwd
pwd_mkdb -d $HOME/etc $HOME/etc/master.passwd
 
# Выставляем права
chown root:wheel  $HOME
chmod 755 $HOME
chmod 755 $HOME
chown -R $USER:$GID $HOME/bin
chown -R $USER:$GID $HOME/etc
chown -R $USER:$GID $HOME/home
chown -R $USER:$GID $HOME/lib
chown -R $USER:$GID $HOME/libexec
chown -R $USER:$GID $HOME/tmp
chown -R $USER:$GID $HOME/usr
chmod 777 $HOME/tmp
 
# Убираем за собой
rm /tmp/libs

5) Если необходимо сделать доступными пользователю еще какието папки (например из /usr/local/www/apache2, можно воспользоваться командой локального монтирования:

mount_nullfs /usr/local/www/apache24/sites/abc/ /home/test/home/test/site/

Карта Манкрафт «Зимнее выживание, огонь факела» от блогера Тёмы

Описание карты: карта содержит очень много построек. Стиль: выживание.Она содержит много секретов и загадок.

Вы появляетесь не просто на пустой карте, а в заснеженном лесу. Здесь вы можете найти бонусные сундуки.

Скачать карту можно здесь. Скачать ресурспак здесь.

Жизнь замечательных грибов