Если вы системный администратор, вы в любой момент времени можете захотеть узнать кто залогинен на вашем Linux сервере. Несомневаюсь что вам известен способ, который позволяет вам узнать это, но знаете ли вы все их и используете самый удобный? В этой статье мы рассмотрим 4 возможных способа.

1. Получаем список пользователей и команды, используемые ими с помощью команды w

Команда w используется для получения списка залогиненных пользователей и выполняемых ими команд. Вывод команды w содержит следующие колонки:[cut]
 Имя пользователя
Номер tty
 Адрес, с которого произошло подключение
 Время подключения
 Время бездействия
 Время, затраченное всеми процессами в данном сеансе (JCPU)
 Время, потраченное текущим процессом (PCPU)
 Команда, выполняемая пользователем

Дополнительно могут быть использованы следующие опции:
 -h игнорировать информацию заголовка
 -u отображать текущую загрузку
 -s Удалить из вывода JCPU, PCPU, и время подключения
$ w
 23:04:27 up 29 days,  7:51,  3 users,  load average: 0.04, 0.06, 0.02
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
ramesh   pts/0    dev-db-server        22:57    8.00s  0.05s  0.01s sshd: ramesh [priv]
jason    pts/1    dev-db-server        23:01    2:53   0.01s  0.01s -bash
john     pts/2    dev-db-server        23:04    0.00s  0.00s  0.00s w
$ w -h
ramesh   pts/0    dev-db-server        22:57   17:43   2.52s  0.01s sshd: ramesh [priv]
jason    pts/1    dev-db-server        23:01   20:28   0.01s  0.01s -bash
john     pts/2    dev-db-server        23:04    0.00s  0.03s  0.00s w -h
$ w -u
 23:22:06 up 29 days,  8:08,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
ramesh   pts/0    dev-db-server        22:57   17:47   2.52s  2.49s top
jason    pts/1    dev-db-server        23:01   20:32   0.01s  0.01s -bash
john     pts/2    dev-db-server        23:04    0.00s  0.03s  0.00s w -u
$ w -s
 23:22:10 up 29 days,  8:08,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM               IDLE WHAT
ramesh   pts/0    dev-db-server        17:51  sshd: ramesh [priv]
jason    pts/1    dev-db-server        20:36  -bash
john     pts/2    dev-db-server         1.00s w -s

 
2. Получаем список пользователей с помощью команды who

Команда who используется для получения списка пользователей, залогиненных в системе. В выводе находятся следующие колонки: имя пользователя, номер tty, дата и время, адрес подключения.
$ who
ramesh pts/0        2009-03-28 22:57 (dev-db-server)
jason  pts/1        2009-03-28 23:01 (dev-db-server)
john   pts/2        2009-03-28 23:04 (dev-db-server)

Для получения отсортированного списка используем команду:
$ who | cut -d’ ‘ -f1 | sort | uniq
john
jason
ramesh
3. Узнаем под каким пользователем залогинены вы сами

Команда whoami сообщит вам информацию о том, под какой учетной записью вы залогинены в системе. Полезно использовать с похмелья
$ whoami
john

whoami дает такую же информацию, как и команда id -un
$ id -un
john
4. Смотрим историю подключений пользователя

Команда last покажет вам историю подключений для определенного пользователя. Если в качестве аргумента не указан логин какого либо пользователя, отобразится история для всех пользователей. Данная информация берется из файла /var/log/wtmp. В выводе присутствуют следующие колонки:
Имя пользователя
Номер Tty
Время и дата подключения
Время отключения
Общее время работы сеанса
$ last jason
jason   pts/0        dev-db-server   Fri Mar 27 22:57   still logged in
jason   pts/0        dev-db-server   Fri Mar 27 22:09 - 22:54  (00:45)
jason   pts/0        dev-db-server   Wed Mar 25 19:58 - 22:26  (02:28)
jason   pts/1        dev-db-server   Mon Mar 16 20:10 - 21:44  (01:33)
jason   pts/0        192.168.201.11  Fri Mar 13 08:35 - 16:46  (08:11)
jason   pts/1        192.168.201.12  Thu Mar 12 09:03 - 09:19  (00:15)
jason   pts/0        dev-db-server   Wed Mar 11 20:11 - 20:50  (00:39

edit post
для этого нужно просто вывести содержимое /etc/passwd :
cat /etc/passwd
а если нужно только реальные юзеры исключая системные:
cat /etc/passwd | awk "/bash/{print}"
даже можно усовершенстовать предидущую команду для получения более простого списка:
cat /etc/passwd | awk "/bash/{print}" | cut -f1 -d :

edit post
для начала нужно все это поставить

cd /usr/ports/audio/musicpd && make config && make install clean
также не помешает mpc
 cd /usr/ports/audio/mpc && make install clean

 cd  /usr/ports/audio/icecast2 && make install clean

Внимание!!!!
затем идет несколько недочетов допущеных криворукими портировщиками MPD на фрибсд
при установке musicpd создается конфиг /usr/local/etc/musicpd.sample

но mpc и musicpd используют старый добрый mpd.conf


по этому копируем cp  musicpd.sample  mpd.conf

и приводим в примерно такой вид

music_directory "/var/mpd/music"
playlist_directory "/var/mpd/.mpd/playlists"
db_file "/var/mpd/.mpd/database_new"
log_file "/var/mpd/.mpd/log"
pid_file "/var/mpd/.mpd/pid"
state_file "/var/mpd/.mpd/state"
sticker_file "/var/mpd/.mpd/sticker.sql"
user "mpd"


audio_output {
type "shout"
encoding "mp3" # optional
  name "Radio"
host "localhost"
port "8000"
mount "/0"
password "hackme"
# quality "5.0"
bitrate "128"
format "44100:16:1"
protocol "icecast2" # optional
user "source" # optional
description "just unzip run enjoy" # optional
genre "industrial" # optional
public "Yes" # optional
timeout "2" # optional
mixer_type "software" # optional
}

bind_to_address "127.0.0.1"

затем конфигурируем icecast на ваш mountpoint

создаем ему повелителя, если сам не создался (icecast)
затем повелителю добавляем задание
crontab -e

@reboot /usr/local/bin/icecast -c /usr/local/etc/icecast.xml






ну и в /etc/rc.d

#for musicpd
musicpd_enable="YES"


ну  и для удобства:


 кому нибудь добавляем
@reboot /usr/local/bin/mpc play






edit post

Парсер Vkontakte.ru

Написано 12:41, ярлыки:

$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) ' . 
             'Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)';

$cookie = '';

$login = 'qazqaz';
$password = 'qazqaz';

$ch = curl_init();

// true т.к. мы будем отправлять post запрос:
curl_setopt($ch, CURLOPT_POST, true);  

// чтобы сайт думал, что мы - браузер:
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 

// ответ сервера будем записывать в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

// по редиректам будем переходить автоматически.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');

//Формирование запроса таким образом, я счел более наглядным
$post = array( 
             'act' => 'login',
             'q' => '',
             'al_frame' => '1',
             'expire' => '',
             'captcha_sid' => '',
             'captcha_key' => '',
             'from_host' => 'vkontakte.ru',
             'email' => $login,
             'pass' => $password
         );

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));

$answer = curl_exec($ch);

/* В $answer нам приходит javascript, который и устанавливает куки 
     с названием: remixsid Нам нужно cпарсить эти 60 символов, 
     идентификатора сессии. с помощью них vkontakte поймет,
     что мы авторизировались.*/

$sid = substr($answer, strpos($answer, "setCookieEx('sid', '") + 20, 60);
$cookie = 'remixsid=' . $sid;

curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie); 

// укажем страницу, с которой мы получим данные для проверки
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/id107073034'); 

$answer = curl_exec($ch);

preg_match('!id="profile_current_info">((.*?))</div>!si',$answer,$data);
//print_r($data);

$pars=iconv('cp1251','utf-8',$data[1]);
//echo $pars;

$p = file_get_contents('/home/megido/l.dat');
if($p != $pars)

$f = @fopen('/home/qazqaz/l.dat','w+');
fwrite($f,$pars);
fclose($f);





//echo $answer; 

curl_close($ch);





edit post
$cnt=100; // общее количество записей во всём выводе
$rpp=10; // кол-во записей на страницу
$rad=1; // сколько ссылок показывать рядом с номером текущей страницы (2 слева + 2 справа + активная страница = всего 5)
$link_sc='page_navigation.php'; // путь
if (isset($_GET['page']))
{
  $page=$_GET['page']-1; // текущая страница
}
else
{
  $page=0;
}
 
$links=$rad*2+1;
$pages=ceil($cnt/$rpp);
if ($page>0) { echo "First | Previous |"; }
$start=$page-$rad;
if ($start>$pages-$links) { $start=$pages-$links; }
if ($start<0) { $start=0; }
$end=$start+$links;
if ($end>$pages) { $end=$pages; }
for ($i=$start; $i<$end; $i++) {
 echo " ";
 
 if ($i==$page) {
  echo "";
 } else {
  echo "";
 }
// echo ($i*$rpp+1)."-";
// if ($i!=($pages-1)) { echo $i*$rpp+$rpp; } else { echo $cnt; }
 echo ($i+1);
 if ($i==$page) {
  echo "";
 } else {
  echo "";
 }
 if ($i!=($end-1)) { echo " |"; }
}
if ($pages>$links&&$page<($pages-$rad-1)) { echo " ... ".($pages).""; }
if ($page<$pages-1) { echo " Next | Last"; }

edit post
для начала создадим скрипт
var d = document;
var offsetfromcursorY=15 // y offset of tooltip
var ie=d.all && !window.opera;
var ns6=d.getElementById && !d.all;
var tipobj,op;
  
function tooltip(el,txt) {
 tipobj=d.getElementById('mess');
 tipobj.innerHTML = txt;
 op = 0.1; 
 tipobj.style.opacity = op; 
 tipobj.style.visibility="visible";
 el.onmousemove=positiontip;
 appear();
}

function hide_info(el) {
 d.getElementById('mess').style.visibility='hidden';
 el.onmousemove='';
}

function ietruebody(){
return (d.compatMode && d.compatMode!="BackCompat")? d.documentElement : d.body
}

function positiontip(e) {
 var curX=(ns6)?e.pageX : event.clientX+ietruebody().scrollLeft;
 var curY=(ns6)?e.pageY : event.clientY+ietruebody().scrollTop;
 var winwidth=ie? ietruebody().clientWidth : window.innerWidth-20
 var winheight=ie? ietruebody().clientHeight : window.innerHeight-20
 
 var rightedge=ie? winwidth-event.clientX : winwidth-e.clientX;
 var bottomedge=ie? winheight-event.clientY-offsetfromcursorY : winheight-e.clientY-offsetfromcursorY;

 if (rightedge < tipobj.offsetWidth) tipobj.style.left=curX-tipobj.offsetWidth+"px";
 else tipobj.style.left=curX+"px";

 if (bottomedge < tipobj.offsetHeight) tipobj.style.top=curY-tipobj.offsetHeight-offsetfromcursorY+"px"
 else tipobj.style.top=curY+offsetfromcursorY+"px";
}

function appear() { 
 if(op < 1) {
  op += 0.1;
  tipobj.style.opacity = op;
  tipobj.style.filter = 'alpha(opacity='+op*100+')';
  t = setTimeout('appear()', 30);
 }
}
затем проинклюдим его и вставим в тело html div в каком будут отображатся подсказки

<div  Style="visibility: hidden; position: absolute" id="mess">





</div>
осталось толко заключить наш текст или картинку или еще чего

над этим текстом подсказка

Пример:

над этим текстом подсказка


* на блоггере она почему то ниже чем нужно

edit post
для подсветки самое лучшее решение бедет скрипты гугла

для этого открывам редактирование шаблона
как показано на рисунке


(для каждой темы придется редактировать шаблон отдельно)



и добавляем после тега <head>
следующий код:




<link href="//google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css">
<script src="//google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">  </script>

ну и дополнив тег body добавив в него это:


onload='prettyPrint()'
на этом настройка заканчивается, для подсветки кода нужно просто заключить его в тег

<pre class="prettyprint">код
</pre>

edit post