На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
McLeod095
Сообщения: 477
ОС: Люблю слаку
Сообщение
McLeod095 » 26.05.2009 14:54
Все здрасте!!
не могу решить вот такую небольшую задачку
есть скрипт такого содержания
Код:
#!/bin/sh
lines=$((`cat $0 | awk '/#!\/bin\/sh/,/^#END/{print}' | wc -l`+1))
echo "This file don't execute"
prog=`tail -n +$lines $0 | gzip -cd | tar xvf -`
echo $prog
bash <$prog
exit 0
#END
�J��A
�0���s������W�5T"-M���+q��"��1�3���sqf_Z��oY��j��s����0�N�?ѝ{m��W��T>�}���㡽��6O��딤��$)Ӝ�N��!�y���uS��'5�e(
В данном примере все работает и файл находящийся в архиве выполняется, но вот хочется мне сократить количесвто строк и не использовать переменную prog а сделать просто перенапправлением но как понять не могу, пытался по разному. То есть охото получить что-то типа <code>bash <tail -n +$lines $0 | gzip -cd | tar xvf - </code>
Заранее спасибо!
ЗЫ. Пишу не для зловредства а для повышения знаний.
"Work PC" E6750/2GB/Asus P5B Deluxe/2x250GB/6600GT 128/Slackware Current (Win 2003 in VmWare)
New Work: E6400/3GB/Arch
Home Book: Asus W6k00A/Arch, Asus 701/Arch
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Сообщение
cy6erGn0m » 26.05.2009 15:10
А почему нельзя
Код: Выделить всё
tail -n +$lines $0 | gzip -cd | tar xvf - | bash
I want to Believe!
They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
McLeod095
Сообщения: 477
ОС: Люблю слаку
Сообщение
McLeod095 » 26.05.2009 15:22
cy6erGn0m писал(а): ↑ 26.05.2009 15:10
А почему нельзя
Код: Выделить всё
tail -n +$lines $0 | gzip -cd | tar xvf - | bash
так не выходит, я уже много чего перепробовал
да и не нужно мне так
потому как не должен он выполнять файл если на нем нет exec
а если написать bash <file то баш его выполнит даже если на нем нет exec
"Work PC" E6750/2GB/Asus P5B Deluxe/2x250GB/6600GT 128/Slackware Current (Win 2003 in VmWare)
New Work: E6400/3GB/Arch
Home Book: Asus W6k00A/Arch, Asus 701/Arch
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Сообщение
cy6erGn0m » 26.05.2009 16:12
Вот я делаю в терминале
Код: Выделить всё
cy6ergn0m@cgmachine ~ $ echo "echo 1" | bash
1
cy6ergn0m@cgmachine ~ $
никакого exec'а.
А вообще зачем там tar? Там правда много файлов?
Если и правда нужно много файлов, то почему нельзя выставить exec для того файла, который внутри сжатого архива? Он ведь при распаковке и распакуется как файл с exec.
I want to Believe!
They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Сообщение
cy6erGn0m » 26.05.2009 16:41
Вот если файл один
Код: Выделить всё
cy6ergn0m@cgmachine ~/test $ cat test
echo 1
cy6ergn0m@cgmachine ~/test $ cat test | bzip2 --best --stdout | base64 > test_c
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | bash
exit 0
#END
cy6ergn0m@cgmachine ~/test $ cat test_c >> test2
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | bash
exit 0
#END
QlpoOTFBWSZTWa2D+pMAAAJZAAAQQAAgAApAoAAhk0wIYBX45cLuSKcKEhWwf1Jg
cy6ergn0m@cgmachine ~/test $ ./test2
13 lines
QlpoOTFBWSZTWa2D+pMAAAJZAAAQQAAgAApAoAAhk0wIYBX45cLuSKcKEhWwf1Jg
1
cy6ergn0m@cgmachine ~/test $
Я тут добавил base64 чтобы здесь показать всё это. Вот прекрасно выполнился вложенный скрипт.
Если именно архив, то выполнить один из скриптов можно так
Код: Выделить всё
cy6ergn0m@cgmachine ~/test $ cat test
echo 1
cy6ergn0m@cgmachine ~/test $ tar -c test | bzip2 --best --stdout | base64 >> test2
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | tar -xO test | bash
exit 0
#END
QlpoOTFBWSZTWexmQTIAAIR7hMEQCAhAAH+AAARqw54gABAACCAAdBKJHqNGgGgNNNBJRqaAZAA0
Db7uxmQgpgAkXykOxrUCLkkD5PGm+bQBaVhtIap9jOVTcgQcqK5viL2UI+O4ow2pK89JzglKH1Lj
NEQPxdyRThQkOxmQTIA=
cy6ergn0m@cgmachine ~/test $ ./test2
13 lines
QlpoOTFBWSZTWexmQTIAAIR7hMEQCAhAAH+AAARqw54gABAACCAAdBKJHqNGgGgNNNBJRqaAZAA0
Db7uxmQgpgAkXykOxrUCLkkD5PGm+bQBaVhtIap9jOVTcgQcqK5viL2UI+O4ow2pK89JzglKH1Lj
NEQPxdyRThQkOxmQTIA=
1
cy6ergn0m@cgmachine ~/test $
I want to Believe!
They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Rootlexx
Бывший модератор
Сообщения: 4462
Статус: GNU generation
ОС: Debian GNU/Linux
Сообщение
Rootlexx » 26.05.2009 17:35
McLeod095 писал(а): ↑ 26.05.2009 14:54
То есть охото получить что-то типа bash <tail -n +$lines $0 | gzip -cd | tar xvf -
Подстановка процессов:
McLeod095
Сообщения: 477
ОС: Люблю слаку
Сообщение
McLeod095 » 26.05.2009 18:29
cy6erGn0m писал(а): ↑ 26.05.2009 16:41
Вот если файл один
Код: Выделить всё
cy6ergn0m@cgmachine ~/test $ cat test
echo 1
cy6ergn0m@cgmachine ~/test $ cat test | bzip2 --best --stdout | base64 > test_c
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | bash
exit 0
#END
cy6ergn0m@cgmachine ~/test $ cat test_c >> test2
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | bash
exit 0
#END
QlpoOTFBWSZTWa2D+pMAAAJZAAAQQAAgAApAoAAhk0wIYBX45cLuSKcKEhWwf1Jg
cy6ergn0m@cgmachine ~/test $ ./test2
13 lines
QlpoOTFBWSZTWa2D+pMAAAJZAAAQQAAgAApAoAAhk0wIYBX45cLuSKcKEhWwf1Jg
1
cy6ergn0m@cgmachine ~/test $
Я тут добавил base64 чтобы здесь показать всё это. Вот прекрасно выполнился вложенный скрипт.
Если именно архив, то выполнить один из скриптов можно так
Код: Выделить всё
cy6ergn0m@cgmachine ~/test $ cat test
echo 1
cy6ergn0m@cgmachine ~/test $ tar -c test | bzip2 --best --stdout | base64 >> test2
cy6ergn0m@cgmachine ~/test $ cat test2
#!/bin/bash
lines=$((`cat $0 | awk '/#!\/bin\/bash/,/^#END/{print}' | wc -l`+1))
echo $lines lines
tail -n +$lines $0
tail -n +$lines $0 | base64 -d | bunzip2 | tar -xO test | bash
exit 0
#END
QlpoOTFBWSZTWexmQTIAAIR7hMEQCAhAAH+AAARqw54gABAACCAAdBKJHqNGgGgNNNBJRqaAZAA0
Db7uxmQgpgAkXykOxrUCLkkD5PGm+bQBaVhtIap9jOVTcgQcqK5viL2UI+O4ow2pK89JzglKH1Lj
NEQPxdyRThQkOxmQTIA=
cy6ergn0m@cgmachine ~/test $ ./test2
13 lines
QlpoOTFBWSZTWexmQTIAAIR7hMEQCAhAAH+AAARqw54gABAACCAAdBKJHqNGgGgNNNBJRqaAZAA0
Db7uxmQgpgAkXykOxrUCLkkD5PGm+bQBaVhtIap9jOVTcgQcqK5viL2UI+O4ow2pK89JzglKH1Lj
NEQPxdyRThQkOxmQTIA=
1
cy6ergn0m@cgmachine ~/test $
Да, так заработало.
Спасибо!
Кстати после проверки меня в принципе устраивает и этот вариант т.к. не извлекает файл в локальную ФС
Rootlexx писал(а): ↑ 26.05.2009 17:35
McLeod095 писал(а): ↑ 26.05.2009 14:54
То есть охото получить что-то типа bash <tail -n +$lines $0 | gzip -cd | tar xvf -
Подстановка процессов:
К сожалению данная конструкция не работает
пишет ошибку
а жаль
такой вариант мне больше нравится
"Work PC" E6750/2GB/Asus P5B Deluxe/2x250GB/6600GT 128/Slackware Current (Win 2003 in VmWare)
New Work: E6400/3GB/Arch
Home Book: Asus W6k00A/Arch, Asus 701/Arch
Rootlexx
Бывший модератор
Сообщения: 4462
Статус: GNU generation
ОС: Debian GNU/Linux
Сообщение
Rootlexx » 26.05.2009 20:23
Какую?
В прикреплённом скрипте в теме «
Решение проблемы со сглаживанием шрифтов в KDE 4.2. » я использовал такую подстановку, работает.
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Сообщение
Portnov » 26.05.2009 21:09
sharutils
? :)
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 26.05.2009 21:19
McLeod095 писал(а): ↑ 26.05.2009 18:29
К сожалению данная конструкция не работает
Shell
doc ~/test $ ll
итого 32
-rw-r--r-- 1 doc doc 169 2009-05-23 02:11 du.sed
-rw-r--r-- 1 doc doc 15 2009-05-18 04:28 lines1.txt
-rw-r--r-- 1 doc doc 94 2009-05-18 04:28 lines2.txt
-rw-r--r-- 1 doc doc 35 2009-05-18 04:28 lines3.txt
-rw-r--r-- 1 doc doc 30 2009-05-25 19:05 st.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test_drb.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test.txt
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:42 ttt/
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:46 ttt2/
-rwxr-xr-x 1 doc doc 75 2009-05-25 19:20 xdg.sh*
doc ~/test $ cat <(ll && ll)
итого 32
-rw-r--r-- 1 doc doc 169 2009-05-23 02:11 du.sed
-rw-r--r-- 1 doc doc 15 2009-05-18 04:28 lines1.txt
-rw-r--r-- 1 doc doc 94 2009-05-18 04:28 lines2.txt
-rw-r--r-- 1 doc doc 35 2009-05-18 04:28 lines3.txt
-rw-r--r-- 1 doc doc 30 2009-05-25 19:05 st.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test_drb.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test.txt
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:42 ttt/
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:46 ttt2/
-rwxr-xr-x 1 doc doc 75 2009-05-25 19:20 xdg.sh*
итого 32
-rw-r--r-- 1 doc doc 169 2009-05-23 02:11 du.sed
-rw-r--r-- 1 doc doc 15 2009-05-18 04:28 lines1.txt
-rw-r--r-- 1 doc doc 94 2009-05-18 04:28 lines2.txt
-rw-r--r-- 1 doc doc 35 2009-05-18 04:28 lines3.txt
-rw-r--r-- 1 doc doc 30 2009-05-25 19:05 st.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test_drb.txt
-rw-r--r-- 1 doc doc 0 2009-05-18 04:28 test.txt
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:42 ttt/
drwxr-xr-x 2 doc doc 4096 2009-05-23 01:46 ttt2/
-rwxr-xr-x 1 doc doc 75 2009-05-25 19:20 xdg.sh*
всё работает.