Вообщем решили открыть такой топик. Будем задават друг другу интересные задачи и вместе искать решения.Ну вот например задача от angra "Как узнать текущее время при помощи ls".
Хотя ответ на этот вопрос есть в моем предидущем топике...
Я эту задачу привел просто для примера.Спасибо надеюсь топик заинтересует многих....
>Вообщем решили открыть такой топик. Будем задават друг другу интересные задачи и
>вместе искать решения.
>
>Ну вот например задача от angra "Как узнать текущее время при помощи
>ls".
>Хотя ответ на этот вопрос есть в моем предидущем топике...
>Я эту задачу привел просто для примера.
>
>Спасибо надеюсь топик заинтересует многих....насчет чистого лс не знаю но можно бы так touch minicom.log; ls -l minicom.log
но лучше ls>/dev/null;date не знаю :)
>[оверквотинг удален]
>>Ну вот например задача от angra "Как узнать текущее время при помощи
>>ls".
>>Хотя ответ на этот вопрос есть в моем предидущем топике...
>>Я эту задачу привел просто для примера.
>>
>>Спасибо надеюсь топик заинтересует многих....
>
>насчет чистого лс не знаю но можно бы так touch minicom.log; ls
>-l minicom.log
>но лучше ls>/dev/null;date не знаю :)Не, нужно только одну комманду ls исползовать. Ладно подождем еще, если никто не ответит напишу ответ.
>Не, нужно только одну комманду ls исползовать.1 способ: после логина на консоль (например tty1) сделать ls -l на /dev/tty1
2 способ: в домашней директории ls -l .. Напротив Вашего "домика" будет текущее время :)
>>Не, нужно только одну комманду ls исползовать.
>
>1 способ: после логина на консоль (например tty1) сделать ls -l на
>/dev/tty1
>2 способ: в домашней директории ls -l .. Напротив Вашего "домика" будет
>текущее время :)Что касаетця первого способа, то это решение не универсально потомучто будет действително только на момент логина.
Насчет 2-го, если честно не очен понял его, если мойно попадробней.На самом деле, хоть в этой задаче и спрашивается про ls, она должна проверить знания совсем в другой области.
>Насчет 2-го, если честно не очен понял его, если мойно попадробней.Ну выполните и посмотрите результат :) Куда уж подробней-то
>>Насчет 2-го, если честно не очен понял его, если мойно попадробней.
>
>Ну выполните и посмотрите результат :) Куда уж подробней-то[arpo@prod1:~] # ls -l ..
total 3056418
drwxr-xr-x 3 arpo other 512 Oct 18 17:26 arpoНу и где тут текущяя дата??
>>>Насчет 2-го, если честно не очен понял его, если мойно попадробней.
>>
>>Ну выполните и посмотрите результат :) Куда уж подробней-то
>
>[arpo@prod1:~] # ls -l ..
>total 3056418
>drwxr-xr-x 3 arpo other
> 512 Oct 18 17:26 arpo
>
>Ну и где тут текущяя дата?Хм, надо було уточнить, что работает, когда у вас что-то пишется, скажем в .bash_history :)
ls -l /proc/self
будет работать всегда
>ls -l /proc/self
>будет работать всегда0 ~ 11:10:02 moon
uni % ls -l /proc/self
lrwxrwxrwx 1 root root 64 2007-11-20 07:35 /proc/self -> 22049Как видите, не всегда :)
>Не, нужно только одну комманду ls исползовать. Ладно подождем еще, если
>никто не ответит напишу ответ.Под Linux можно примерно так
# ls /dev/core && ls -lu --time-style=full-iso /dev/core
>
>>Не, нужно только одну комманду ls исползовать. Ладно подождем еще, если
>>никто не ответит напишу ответ.
>
>Под Linux можно примерно так
>
># ls /dev/core && ls -lu --time-style=full-iso /dev/coreЛадно не будем тянуть, темболее что задача не моя.
Эта задача проверяет знания фаиловой системы /proc. Решение очень простое ls -e /proc/self.
Каждый процесс создает в /proc симлинк на папку с PID-ом в тойже /proc.Ждем новых задач....
>Ладно не будем тянуть, темболее что задача не моя.
>Эта задача проверяет знания фаиловой системы /proc. Решение очень простое ls -e
>/proc/self.
>Каждый процесс создает в /proc симлинк на папку с PID-ом в тойже
>/proc.
>
>Ждем новых задач....Под фрей
# ls -e /proc/self
ls: illegal option -- eПод центосом
# ls -e /proc/self
ls: invalid option -- eПод sun4v
# ls -e /proc/self
gls: invalid option -- eЧто имелось ввиду?
>Что имелось ввиду?Видимо ls -lu /proc/self
>[оверквотинг удален]
>
>Под центосом
># ls -e /proc/self
>ls: invalid option -- e
>
>Под sun4v
># ls -e /proc/self
>gls: invalid option -- e
>
>Что имелось ввиду?Под solaris10
ls -e /proc/self lrwxrwxrwx 1 arpo other 0 Nov 20 11:26:26 2007 /proc/self -> 12341man ls
-e The same as -l, except displays time to the second,
and with one format for all files regardless of
age: mmm dd hh:mm:ss yyyy.Можете не исползовать -e это всеголиш для лучшего datestamp-а, возможно у вас в системе это опция -E....
Думаю задачу можно считать решонной. Ждем новых.....
>Думаю задачу можно считать решонной. Ждем новых.....http://www.opennet.me/openforum/vsluhforumID9/6957.html Чем не задачка? :)
Задача то она задача, просто дело в том что если не знаеш ответ на задачу то это уже проблема, а в этом топике мы все таки решили обсуждать задачи...З.Ы. Кстати я видел ваш топик, но ничего в голову не приходит...
>Задача то она задача, просто дело в том что если не знаеш
>ответ на задачу то это уже проблема, а в этом топике
>мы все таки решили обсуждать задачи...
>
>З.Ы. Кстати я видел ваш топик, но ничего в голову не приходит...
>Ну тогда. Боянчег.
$ rm *
bash: /bin/rm: Argument list too longКак все же удалить файлы, не трогая (вообще) директорию.
Вариантов масса, попробуем найти лучший?
>[оверквотинг удален]
>>З.Ы. Кстати я видел ваш топик, но ничего в голову не приходит...
>>
>
>Ну тогда. Боянчег.
>
>$ rm *
>bash: /bin/rm: Argument list too long
>
>Как все же удалить файлы, не трогая (вообще) директорию.
>Вариантов масса, попробуем найти лучший?можно что-та типа find . -type f |xargs rm или find . -type f -exec rm {} \;
>[оверквотинг удален]
>>Ну тогда. Боянчег.
>>
>>$ rm *
>>bash: /bin/rm: Argument list too long
>>
>>Как все же удалить файлы, не трогая (вообще) директорию.
>>Вариантов масса, попробуем найти лучший?
>
>можно что-та типа find . -type f |xargs rm или find .
>-type f -exec rm {} \;Ну вот, не дали даже молодежи голову поломать =)
Хотя, если нет пробелов в именах файлов то можно делать даже проще
ls | xargs rm
>[оверквотинг удален]
>>>Как все же удалить файлы, не трогая (вообще) директорию.
>>>Вариантов масса, попробуем найти лучший?
>>
>>можно что-та типа find . -type f |xargs rm или find .
>>-type f -exec rm {} \;
>
>Ну вот, не дали даже молодежи голову поломать =)
>Хотя, если нет пробелов в именах файлов то можно делать даже проще
>
>ls | xargs rmДа я сам еще не особо стар:)
Ладно больше не буду:):)
Еще одна задачка которую задал мне angra.
Почему find / -name a* может выдать разный набор файлов для разных пользователей, а иногда даже и для одного.
старо ...
все зависит от того как шел раскроет
a*
это ведь не
"a*">Еще одна задачка которую задал мне angra.
>Почему find / -name a* может выдать разный набор файлов для разных
>пользователей, а иногда даже и для одного.
>старо ...
>все зависит от того как шел раскроет
>a*
>это ведь не
>"a*"
>
>>Еще одна задачка которую задал мне angra.
>>Почему find / -name a* может выдать разный набор файлов для разных
>>пользователей, а иногда даже и для одного.)точно..
[..]
>>Как все же удалить файлы, не трогая (вообще) директорию.
>>Вариантов масса, попробуем найти лучший?
>
>можно что-та типа find . -type f |xargs rm или find .
>-type f -exec rm {} \;Можно короче: find . -type f -delete
>[..]
>>>Как все же удалить файлы, не трогая (вообще) директорию.
>>>Вариантов масса, попробуем найти лучший?
>>
>>можно что-та типа find . -type f |xargs rm или find .
>>-type f -exec rm {} \;
>
>Можно короче: find . -type f -deleteВ Solaris-е не работает:(
>Ну вот например задача от angra "Как узнать текущее время при помощи
>ls".В Соляре при включенном Process Accounting:
ls -l /var/adm/pacct>$ rm *
>bash: /bin/rm: Argument list too long
>Как все же удалить файлы, не трогая (вообще) директориюДобавлю свои 5 копеек -)
for file in * ; do rm $file ;done
>>Ну вот например задача от angra "Как узнать текущее время при помощи
>>ls".
>
>В Соляре при включенном Process Accounting:
>ls -l /var/adm/pacct
>Тоже вариант, но он не у всех включен. У меня например нет.
>>В Соляре при включенном Process Accounting:
>>ls -l /var/adm/pacct
>>
>Тоже вариант, но он не у всех включен. У меня например нет.
>Так ведь вариант с /proc уже прозвучал - вот и пришлось проявить фантазию -))
>>>В Соляре при включенном Process Accounting:
>>>ls -l /var/adm/pacct
>>>
>>Тоже вариант, но он не у всех включен. У меня например нет.
>>
>
>Так ведь вариант с /proc уже прозвучал - вот и пришлось проявить
>фантазию -)))А у вас нету интересной задачки???
>)А у вас нету интересной задачки???Насчет интересности не уверен))
Вот кусочек вывода команды df -h :Filesystem size used avail capacity Mounted on
[...]
/dev/vx/dsk/icsdg/ict
287G 137M 269G 1% /ora/ICT
/dev/vx/dsk/icsdg/redo2
3.0G 18M 2.8G 1% /ora/ICT/redo2
/dev/vx/dsk/icsdg/data
67G 82M 63G 1% /ora/ICT/data
/dev/vx/dsk/icsdg/edr_index
44G 76M 41G 1% /ora/ICT/edr_index
[...]Почему $size - $used != $avail ?
>[оверквотинг удален]
> 67G 82M 63G
> 1% /ora/ICT/data
>/dev/vx/dsk/icsdg/edr_index
>
>
> 44G 76M 41G
> 1% /ora/ICT/edr_index
>[...]
>
>Почему $size - $used != $avail ?Какаято расница всегда есть, но тут странно....Посмотрим что скажут остальные...
>[оверквотинг удален]
> 67G 82M 63G
> 1% /ora/ICT/data
>/dev/vx/dsk/icsdg/edr_index
>
>
> 44G 76M 41G
> 1% /ora/ICT/edr_index
>[...]
>
>Почему $size - $used != $avail ?Потому что 8% зарезервировано за рутом. ufs-фича, afaik.
tunefs -p /
-5% зарезервированые для суперпользователя.>[оверквотинг удален]
> 67G 82M 63G
> 1% /ora/ICT/data
>/dev/vx/dsk/icsdg/edr_index
>
>
> 44G 76M 41G
> 1% /ora/ICT/edr_index
>[...]
>
>Почему $size - $used != $avail ?
Непонятки: почему у каталога рабоает sgid и не работает suid?
>Потому что 8% зарезервировано за рутом. ufs-фича, afaik.Верно.
>Непонятки: почему у каталога рабоает sgid и не работает suid?
Никакого ответа кроме: "Потому что" в голову не приходит :)
>Никакого ответа кроме: "Потому что" в голову не приходит :)А по логике я ожидал что будет :)
>
>>Никакого ответа кроме: "Потому что" в голову не приходит :)
>
>А по логике я ожидал что будет :)Хе, если по логике, то suid не работает потому что если он заработает, то ты не сможешь редактировать созданные тобой же файлы. А это нехорошо :)
>>
>>>Никакого ответа кроме: "Потому что" в голову не приходит :)
>>
>>А по логике я ожидал что будет :)
>
>Хе, если по логике, то suid не работает потому что если он
>заработает, то ты не сможешь редактировать созданные тобой же файлы. А
>это нехорошо :)Ну уж umask и вхождение в группу моё дело :)
Я думал эта тема многих заинтересует.. что больше нету интересных вапросов??
>>Хе, если по логике, то suid не работает потому что если он
>>заработает, то ты не сможешь редактировать созданные тобой же файлы. А
>>это нехорошо :)
>
>Ну уж umask и вхождение в группу моё дело :)Так ведь дефолтный umask 022 ;)
Вообще вопрос странный :) Почему разработчики сделали так а не иначе. А почему светофор красно-зеленый а не оранжево-синий ?:)
Ладно уж, колись в чем наколка :)
>>>Хе, если по логике, то suid не работает потому что если он
>>>заработает, то ты не сможешь редактировать созданные тобой же файлы. А
>>>это нехорошо :)
>>
>>Ну уж umask и вхождение в группу моё дело :)
>
>Так ведь дефолтный umask 022 ;)
>Вообще вопрос странный :) Почему разработчики сделали так а не иначе. А
>почему светофор красно-зеленый а не оранжево-синий ?:)
>Ладно уж, колись в чем наколка :)Да никакой наколки, бит есть а не работает вот и всё :)
>[оверквотинг удален]
>>>
>>>Ну уж umask и вхождение в группу моё дело :)
>>
>>Так ведь дефолтный umask 022 ;)
>>Вообще вопрос странный :) Почему разработчики сделали так а не иначе. А
>>почему светофор красно-зеленый а не оранжево-синий ?:)
>>Ладно уж, колись в чем наколка :)
>
>Да никакой наколки, бит есть а не работает вот и всё :)
>типа задал задачу а сам ответ не знаю....
-= Позволить одному пользователю менять пароль другого пользователя =-
(без использования su, sudo)
++++++++++++++++++
#!/bin/bash
passwd user2
++++++++++++++++++Владелец скрипта - root, группа - user, установлен suid.
Файл запускает user2.Почему это не сработает? ;)
>(без использования su, sudo)
>++++++++++++++++++
>#!/bin/bash
>passwd user2
>++++++++++++++++++
>
>Владелец скрипта - root, группа - user, установлен suid.
>Файл запускает user2.
>
>Почему это не сработает? ;)Наверное потому-что passwd сам с битом suid.
>[оверквотинг удален]
>>#!/bin/bash
>>passwd user2
>>++++++++++++++++++
>>
>>Владелец скрипта - root, группа - user, установлен suid.
>>Файл запускает user2.
>>
>>Почему это не сработает? ;)
>
>Наверное потому-что passwd сам с битом suid.Даже если снять не заработает. Хотя под OpenBSD заработает, если мне память не изменяет =)
Решение вот: "Due to the increased likelihood of security flaws, many operating systems ignore the setuid attribute when applied to executable shell scripts."
Скорее всего не только shell, но и вообще для всех скриптов, то есть небинарных исполнимых файлов. Переходить или не переходить в другой uid зависит от интерпретатора, например если установлен perl-suid, то перловый скрипт будет реагировать на suid, в противном случае - нет.
#include <stdio.h>
#include <stdlib.h>int main(void){
int i=2;
if(-10 * abs(i - 1) == 10 * abs(i - 1)){
printf("OMG,-10==10 in linux!\n");
} else {
printf("nothing special here\n");
}
return 0;
}Вопрос: почему так происходить в линуксе?
> if(-10 * abs(i - 1) == 10 * abs(i - 1)){
>Вопрос: почему так происходить в линуксе?В даном случаи есть понятие не определенность при компиляции. Разработчики могут на свое усмотрение вычислять в разной последовательности, даже в стандарте на компилятор указано что пока нет точки с запитой значение переменных не определено и может быть любое и только после точки с запитой выражение определено.
Если четко определить последовательность то все работает правильно:
int i = 2;
int k,l;k = abs(i - 1);
k = -10 * k;
l = abs(i - 1);
l = 10 * l;
>> if(-10 * abs(i - 1) == 10 * abs(i - 1)){вот например: printf("%d %d %d\n", i++, i++, i++) - тут неорпределенность о которой вы говорили. а вышеприведенном выражении умножение константы на вызов ф-и, какая же тут неопределенность.
З.Ы. причем результат не зависит ни от значения i ни от замены 10и на любое другое число.
>>> if(-10 * abs(i - 1) == 10 * abs(i - 1)){
>
>вот например: printf("%d %d %d\n", i++, i++, i++) - тут неорпределенность о
>которой вы говорили. а вышеприведенном выражении умножение константы на вызов ф-и,
>какая же тут неопределенность.
>
>З.Ы. причем результат не зависит ни от значения i ни от замены
>10и на любое другое число.Самое интересное вот что получается при компиляции
gcc -Wall -O -c inet.c
//inet.c
int main(void)
{
int i=2;
int i0,i1;
if( ((-10) * (abs(i - 1))) == (10 * (abs(i - 1)))){
printf("OMG,-10==10 in linux!\n");
}
else {
printf("nothing special here\n");
}
return 0;
}
// init.s
.file "inet.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "OMG,-10==10 in linux!"
.text
.globl main
.type main, @function
main:
pushl Кp
movl %esp, Кp
subl $8, %esp
andl $-16, %esp
subl $28, %esp
pushl $.LC0
call puts
addl $16, %esp
movl $0, Йx
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)"здесь видно что даже строки которая отвечает за вывод альтернативы нет.
Значит при проходи компилятора он решил что она не нужна!!
Значит уже на этапе компиляции принято решение что -10==10.А вот что получается когда компилируеш с такими же опциями
// inet.c
int main(void)
{
int i=2;
int i0,i1;
i0 = abs(i - 1);
i0 = -10 * i0;
i1 = abs(i - 1);
i1 = 10 * i1;
if(i0 == i1){
printf("OMG,-10==10 in linux!\n");
}
else {
printf("nothing special here\n");
}
return 0;
}
//inet.s
.file "inet.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC1:
.string "nothing special here"
.text
.globl main
.type main, @function
main:
pushl Кp
movl %esp, Кp
subl $8, %esp
andl $-16, %esp
subl $28, %esp
pushl $.LC1
call puts
addl $16, %esp
movl $0, Йx
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)"И опять решение о сравнении находится на этапе компиляции.
Видно что сам компилятор игнорирует функцию abs. Только сейчас обратил внимание.
Может у кого-то еще будут предложения. Пока у меня ответа нет.
Интересно что -10*abs(1-i) = 10 :)
Тьфу -10
>Вопрос: почему так происходить в линуксе?Это не в линуксе так происходит, а в gcc.
man abs - GCC handles abs() and labs() as builtin functions.
видимо в gcc abs определена как unsigned int abs (int) и соответственно всё приводится к unsigned.
$ uname -a
Linux trantor 2.6.22-gentoo-r8 #1 SMP PREEMPT Fri Sep 28 23:15:32 EDT 2007 i686 AMD Athlon(tm) 64 X2 Dual Core Processor 3800+ AuthenticAMD GNU/Linux$ gcc -Wall -fno-builtin -o test test.c
$ ./test
nothing special here$ gcc -Wall -o test test.c
$ ./test
OMG,-10==10 in linux!
это был баг в ЖЦЦ.
This is a bug of gcc which was recently fixed.
http://www.nabble.com/-PATCH--Fix-PR34130,-extract_muldiv-broken-t4826688.html
http://gcc.gnu.org/viewcvs?view=rev&revision=130258If you use -fno-builtin option, you can avoid this bug.
задачку можно считать решенной, если так можно сказать.