Skip to content

Monthly Archives: Февраль 2011

Адекватны ли пользователи вашей системы?

История: Как-то давно писал статью на Хабре, но что-то не взлетела, решил вот утащить её в свой блог, может вторая жизнь породит новые веяния в умах =)

Наверняка многие использовали для записи сессий командной строки программу script.
А кто-нибудь задавался вопросом, а можно ли использовать её в рамках повышения безопасности/мониторинга/проверки адекватности пользователей системы?
Любопытства ради решил прикрутить script ко всем пользователям системы и посмотреть, что из этого выйдет…

 

#!/bin/sh
if [ "$TERM" != "" ]; then
DATE=`date +%F.%H.%M`
FOLDER="/tmp/"
exec script -q -t $FOLDER$USER.$DATE 2> $FOLDER$USER.$DATE.time
else
/bin/sh $*
fi

Добавляем такой скрипт в /etc/profile (в gentoo сохранил это в файл bash.sh и поместил его в директорию /etc/profile.d/).

Можно проверять работоспособность, заходя по SSH или любым другим способом.

В /tmp должны появиться файлы вида test.2010-03-25.20.01 и test.2010-03-25.20.01.time.
Файл c .time содержит в себе всю информацию по таймингу сессии.

Если файлы создались, дабы проверить плоды, запускаем:

scriptreplay test.2010-03-25.20.01.time test.2010-03-25.20.01

и наслаждаемся просмотром.

Хочу сразу сказать недоработки:
1 Если подключаться ssh user@host /bin/bash -i — то ничего не логируется =(

Основной интерес к этому способу появился от желания последить за работой новых админов, посмотреть их способы (не стоять же за спиной у бедняги).

Так же можно создать отдельный каталог вместо /tmp, например /opt/sessions и задать права:

chmod 733 /opt/sessions

Дабы все сессии могли писать, но юзеры не могли сделать листинг этой дирекории.

Оригинал

Экстремальное парное программирование

Из всех практик экстремального программирования, наибольшее сопротивление встречает парное программирование. Некоторые любят его, а некоторые ненавидят.

Болтливый кодер

Как и все, некоторые программисты любят обсуждать стоящие перед ними проблемы. Они, как правило, обсуждаются за чашечкой чая, будь это логика, которая должна быть в модели, или она должна быть извлечена в отдельный вспомогательный класс.

Что вы думаете? Принадлежит ли это к этому домену или нет? Много ли выполняет этот класс?

Естественно, что такой тип программистов испытывает наслаждение от парного программирования и понимает его преимещества, потому что он чувствует, что его навыки в паре улучшаются и код становится лучше. Конечно, вы столкнетесь с огромным количеством разговоров, но такие программисты продолжают работать даже за обедом, обсуждая волнующие их темы.

Герой в наушниках

Другие же больше любят работать в одиночку, они предпочитают воткнуть наушники и погрузиться в свой отрешенный от офисной суеты мир. Они не задают вопросов и стараются войти в нирвану программирования 🙂 Они, как правило, не большие фанаты парного программирования. Они не будут жаловаться, если посадить с ними кого-то рядом, хоть это и будет их раздражать. Но если посадить с ними кого-то с меньшими навыками, то они воспримут это как возможность поупражняться и будут более открыты для общения. Они могут упорно набивать код, пока не начинают понимать, что за ними уже минут 30 наблюдает их партнер. В таком случае они передают эстафету с видом «ну пакажи на что ты способен». Вы можете воспринять это как покровительство, но со временем «герои» осознают, что и они могут получить плюсы, которые помогут им на их пути в нирвану.

Трололокодер

Для некоторых, каждое действие совершенное другим — повод подискутировать. Эти люди клянутся, что наслаждаются парным программированием, но только если они могут указывать на ошибки партнера в паре. Они могут быть разрушительны для команды и очень часто являются страхом для напарника. Время лечит, и со временем эти засранцы перестают так яро что-то доказывать и начинают понимать то, как другие люди воспринимают их.

Техники парного программирования:

«Пинг-понг» программирование

Один пишет неработающий тест, другой должен заставить его работать, затем они пишут другой неработающий тест и т.д.. Это наиболее известная техника в парном программировании. Она достаточно неплохо работает, воспринимается как игра, в которой ты пытаешься сломать или починить чужой код, пытаясь привнести как можно меньше своего кода в него.

Слияние пары и саморазвитие

Данная техника подразумевает обмен знаниями между более и менее квалифицированными программистами. Данная техника также характеризует «героя в наушниках». Некоторые люди не понимают преимуществ парного программмирования, но скажите им, что это для обмена опытом и они примут его. С течением времени они даже начнут наслаждаться им. Но, конечно, они всегда могут вернуться к своим наушникам =)

Удаленное парное программирование

Здесь может возникнуть множество проблем при становлении пары. Но если пара сработается, то не будет уже особой разницы, сидят они за одним столом или находятся на разных континентах. Сейчас существует огромное количество различных способов удаленного взаимодействия, так что всех их здесь описывать не имеет смысла.

Ротация пар

Иногда ротацию пар крайне сложно реализовать, потому что у нас быстро входит в привычку постоянно работать с тему же самыми людьми.
Основная цель данной техники для всех разработчиков — знать все наработки по всем задачам. Ротация пар крайне важна для поддержания команды в хорошей форме. Наибольшим преимуществом ротации пар является возможность быстрой подмены внутри пар, т.е. таким образом мы защищаем себя от возможных простоев по причине отсутствия одного из программистов внутри конкретной пары, поскольку все внутри команды знакомы с контекстом задачи. Я думаю, не стоит привязывать ротацию к каким-то определенным временным рамкам, поскольку никто не любит прерываться в середине выполняемой задачи.

Оригинал

Неоднозначные «приветствия мира»

Всё привыкли, что программисты — уравновешенные, спокойные, логически мыслящие люди..
Но по примерам кода, которые представлены ниже, так и хочется назвать некоторых из них — АДСКИМИ ПСИХОПАТАМИ !! +) Ну и конечно же в нашем обществе существует такой стереотип в основном о программистах на С..

Вынос мозга раз:

    #define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h>

Дваз:

#include<stdio.h>
main(){
int x=0,y[14],*z=&amp;y;*(z++)=0x48;*(z++)=y[x++]+0x1D;
*(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+0x03;
*(z++)=y[x++]-0x43;*(z++)=y[x++]-0x0C;*(z++)=y[x++]+0x57;
*(z++)=y[x++]-0x08;*(z++)=y[x++]+0x03;*(z++)=y[x++]-0x06;
*(z++)=y[x++]-0x08;*(z++)=y[x++]-0x43;*(z++)=y[x]-0x21;
x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
}

Триз:

#include<stdio.h>
#define __(a) goto a;
#define ___(a) putchar(a);
#define _(a,b) ___(a) __(b);
main()
{ _:__(t)a:_('r',g)b:_('$',p)
c:_('l',f)d:_(' ',s)e:_('a',s)
f:_('o',q)g:_('l',h)h:_('d',n)
i:_('e',w)j:_('e',x)k:_('n',z)
l:_('H',l)m:_('X',i)n:_('!',k)
o:_('z',q)p:_('q',b)q:_(',',d)
r:_('i',l)s:_('w',v)t:_('H',j)
u:_('a',a)v:_('o',a)w:_(')',k)
x:_('l',c)y:_('t',g)z:___(0x0)}

Четырез:

int n[]={0x48,
0x65,0x6C,0x6C,
0x6F,0x2C,0x20,
0x77,0x6F,0x72,
0x6C,0x64,0x21,
0x0A,0x00},*m=n;
main(n){putchar
(*m)!=''?main
(m++):exit(n++);}
 

Пздез:

main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
<<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
<<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
<<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
)))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
)<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
-((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
<<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
<<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
)<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
<<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
<<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
(((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
<<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
>>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
<(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
))) + (1<<1)); i++) printf("%c",n[i]); }
 

Как из плюсиков и минусов вырисовываются слова??

#include <stdio.h>
#define _(_) putchar(_);
int main(void){int i = 0;_(
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++i)_(++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++i)_(++++++++++++++
i)_(--++i)_(++++++i)_(------
----------------------------
----------------------------
----------------------------
----------------------------
----------------i)_(--------
----------------i)_(++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++i)
_(----------------i)_(++++++
i)_(------------i)_(--------
--------i)_(----------------
----------------------------
----------------------------
----------------------------
----------------------------
------i)_(------------------
----------------------------
i)return i;}

P.S. может у кого-то такой стиль используется на предприятии в качестве основного стиля форматирования и обфускации? o_O