LINUX.ORG.RU

Сообщения Pashtet

 

chmod через pipe или перенаправление

Господа, приветствую! Гугл не помог. Необходимо создать пустой файл и присвоить ему бит исполняемости. Не нашел способа сделать это напрямую, без создания промежуточных переменных. Т. е. понятно, что можно так:

NEW_FILE="$1"
I="${NEW_FILE:-$(echo 1-$RANDOM.sh)}"
touch "$I"
chmod 777 "$I"
Понимаю что нерабочие схемы, идею хочется пояснить. Что-то ВРОДЕ:
touch "${NEW_FILE:-$(echo 1-$RANDOM.sh)}" | chmod 777
или
chmod 777 < $(touch "${NEW_FILE:-$(echo 1-$RANDOM.sh)}")
т.е непонятно, можно ли подложить агрумент с именем файла chmod'у. Буду благодарен за любую помощь.

 , , ,

Pashtet
()

sed / awk - помощь по изменению строки в bash

Господа, приветствую! Возникла необходимость править чать файла конфигурации. Как править на основе шаблонов немного разбираюсь, но тут возникла задача заменить срочку после паттерна, а не на его основе. Т.е. мне нужно изменить строчку " path = /home/user/Media/Temp/" после " [Temp]" на другое значение. Собственно проблема состоит в том, что значение «/home/user/Media/Temp/» здесь для примера, оно не известно скрипту перед изменением. Другими словами, нужно неизвестную строчку после " [Temp]" изменить на новое значение.

[Foto]
        path = /media/user/Media/Foto/
        comment = Альбомы фотографий
        
 [Temp]
        path = /home/user/Media/Temp/
        comment = Temp

Гуглить пробовал, но все не то. До чего дошел своими силами: Добавить к строке «опознавательный знак» в виде комментария " path = /home/user/Media/Temp/ # temp" и на его основе править строку:

FOLDER=$(kdialog --getexistingdirectory)
A=' # temp'
B="        path = $FOLDER/ # temp"
sed -i "s|.*${A}|${B}|g" /etc/rsyncd.conf

и это работает. Жаль только с этим комментарием rsync не дружит, не понимает путь. Требует чистого параметра, без комментариев. Подскажите, плиз, как поменять строку. Возможно как-то ее удалить, и после «sed -i »/[Temp]/ a\........", или как-то еще. Заранее благодарю.

 , ,

Pashtet
()

Подстановка алиаса через переменную в BASH

Приветствую!

Помогите разобраться. Пишу скриптик, столкнулся с проблемкой. Скрипт в работе использует алисы доступные пользователю из ~/.bash_aliases. Если имя алиаса явно указать в скрипте, то он срабатывает, если попытаться подставить с помощью переменной - не работает. В скрипте необходимо имено через переменную. Вот пример кода, с сутью проблемы:

#! /bin/bash -i
shopt -s expand_aliases

alias update1='sudo apt-get update' # это для примера, на боевой машине список алиасов уже существует.

update1 # алиас выполняется без проблем

testalias=update1 # создаем переменную с названием алиаса

$testalias

# подстановка названия алиаса происходит, но он не выполняется, а вылетает ошибка "update1: команда не найдена"

Буду благодарен за любую помощь.

 , ,

Pashtet
()

Вызвать SSH под SSH

Добрый день. Описание происходящего: Есть удаленный сервер. Запускаю из дома скрипт, который по ssh на него заходит, и запускает на нем другой скрипт, который по rsync собирает из тамошней сети с машин бекапы на этот сервер. Все было хорошо, пока одной из машин не оказался ноутбук, на котором подняты два интерфейса - WiFi и LAN подключенные к одному роутеру. Мне перед запуском бэкапа нужно положить WiFi интерфейс на этом ноутбуке. Написал скрипт, который лежит на сервере и выполняет эту задачу - заходит по SSH на ноутбук, и кладет интерфейс. Все работает, когда я запускаю этот скрипт вручную. Т.е. захожу по SSH из дома на сервер и запускаю скрипт - все работает. Задумал я автоматизировать процесс, и добавил вызов этого скрипта в скрипт бэкапа этого ноутбука. И все, не работает. Получается что первый скрипт заходит по SSH на сервер, выполняет там скрипт, который тоже должен зайти по SHH на следующую машину. И вот этот следующий вход по SSH не удается. Такое действие вообще возможно? Вызвать SSH под SSH? Условно:

1) ssh user1@IP1 'command; bash /.../.../1.sh'

2) а этот 1.sh содержит вызов: ssh user2@IP2 'command'

Пробовал разные варианты, пока гуглил, но ничего внятного. Основные ошибки «Host key verification failed.» или «Permission denied, please try again.» Еще раз повторю, скрипт рабочий, вручную отрабатывает без ошибок...

Заранее благодарю.

 

Pashtet
()

Автостарт скрипта в отдельном окне, при запуске системы

Привет! Как реализовать такую штуку. Вот, исполняется в отдельном окне KDE (например konsole) интерактивный bash скрипт, в какой-то момент требуется перезагрузка ОС. ОС перезагружается, и после перезагрузки скрипт продолжает выполняться, только опять в окне. Не где-то в фоне, или в виде демона, а в окне, для продолжения интерактивности. Пробовал cron, systemd, но это запуск в виде демонов, а мне нужно в отдельном окне. Возможна вообще такое?

Можно проще сформулировать. Существует ли возможность запланировать запуск некоего скрипта при старте системы (с остальными вопросами сам разберусь), который будет запускаться в отдельном окне оболочки, в графическом интерфейсе.

Заранее благодарю.

 , ,

Pashtet
()

AWK функция в BASH

Друзья! Помогите. Я не программист, так, пишу посильные прикладные скрипты для себя. Возникла необходимость проверки IP адреса в скрипте. Накомпилил из сети функцию (c awk незнаком):

TEST_IP () {
echo $1 | awk -F "." '{if ( NF != 4 ) print "Ввод не является IP адресом";
else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "Валидный IP адрес";
else print "Невалидный IP адрес"}'
}


Не могу разобраться, есть ли возможность, вместе с сообщениями:
<print "Ввод не является IP адресом">; <print "Невалидный IP адрес">, возвращать код ошибки 1, как бы exit 1,
а вместе с сообщением <print "Валидный IP адрес"> - возвращать exit 0?
Т.е. другими словами, что бы функция на if else и else выдавала определенный мной код завершения?
Заранее спасибо!

 , ,

Pashtet
()

Помощь по скрипту BASH

Приветствую!

Написал такую конструкцию:

find -maxdepth 1 -type f -regex '.*\(jpg\)' | grep -oE '[^/]+.$' | cut -d'.' -f1 > /tmp/JPG_F
find .. -maxdepth 1 -type f -regex '.*\(pp3\|CR2\)' | grep -oE '[^/]+.$' | cut -d'.' -f1 > /tmp/CR2_F
grep -vFf /tmp/JPG_F /tmp/CR2_F > /tmp/RM_Files.txt
old_IFS=$IFS; IFS=$'\n'
for RM in $( </tmp/RM_Files.txt ); do rm ../$RM* > /dev/null 2>&1; done
IFS=$old_IFS

Смысл в том, что:

1) ищутся в текущей директории файлы с расширением jpg, затем записываются в файл только имена

2) ищутся в директории на уровень выше файлы с расширением pp3 и CR2, затем записываются в файл только имена

3) выявляются на основе первого файла «лишние» файлы во втором каталоге (несовпадающие с именами в первом), затем записываются в файл

4) удаляются файлы из созданного списка отличий

Чего хочется - уйти от перенаправлений в файлы. Что-то вроде

1) тут понятно - A=`find -maxdepth 1 -type f -regex '.*\(jpg\)' | grep -oE '[^/]+.$' | cut -d'.' -f1`

2) тут понятно - B=`find .. -maxdepth 1 -type f -regex '.*\(pp3\|CR2\)' | grep -oE '[^/]+.$' | cut -d'.' -f1`

3) вот тут засада, понимаю что бред, но смысл - C=`grep -vFf «$A» «$B»`

4) ну и old_IFS=$IFS; IFS=$'\n' for RM in $С; do rm ../$RM* > /dev/null 2>&1; done IFS=$old_IFS

Спасибо за любую помощь!

 

Pashtet
()

Не работает пренаправление через cat

Я не программист, так что долго не смейтесь. Написал коротенький скрипт, для проверки на бэд-блоки. не работает та часть, где из лога работы программы badblocks, нужно скопировать результат в конечный лог:

#! /bin/bash
# ========================================================
test -d /LOGS/sdb1 || { mkdir -p /LOGS/sdb1 && LOGPATH="/LOGS/sdb1" || LOGPATH='/tmp'; } && LOGPATH="/LOGS/sdb1" # настройка директории логировани
DATE=`date +%x_%Hh-%Mm-%Ss`
exec > >(tee "$LOGPATH/sdb1"_current.txt) # запуск с этого места логирования работы скрипта в файл
# =============================================================
echo ===============================================================
echo
echo "Старт проверки на bad-блоки раздела sdb1 - $DATE"
echo
badblocks -svo /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list /dev/sdb1
echo
echo ----------------------------------------------------------------
echo "Содержимое лог-файла badblocks_sdb1.list:"
echo
if [[ -e /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list ]]
    then
        if [[ ! -s /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list ]]
            then
                echo "Проверка завершена без ошибок"
            else
                cat /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list >> "$LOGPATH/sdb1"_current.txt
        fi
    else
        echo " Файл /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list не найден"
fi
echo ----------------------------------------------------------------
echo
echo "Завершена проверка на bad-блоки раздела sdb1 - $DATE"
echo ===============================================================

Т.е. при перенаправлении «>>» не происходит ничего, пустая строка (лог-файл, разумеется, не пустой). Если поставить одинарный символ перенаправления «>», то работает логичнее, удаляет все, что перед CAT, добавляет данные о сбойных секторах, и корректно дописывает файл.

Смысл, чего хочу добиться, что бы между строками

echo ----------------------------------------------------------------
echo "Содержимое лог-файла badblocks_sdb1.list:"
и
echo ----------------------------------------------------------------
в конечном логе «$LOGPATH/sdb1»_current.txt было содержимое файла /media/8804afd8-a1df-409d-927b-da6cfcaf5a14/badblocks_sdb1.list Возможно коряво объяснил, но если сможете помочь, буду очень признателен!

 ,

Pashtet
()

RSYNC - права доступа на конечную директорию

Моя проблема с rsync заключается в правах доступа на конечную директорию. Пример: создаю соединение - rsync -avz home@192.168.1.3:/media/home/Media/Foto/ /media/04d541d2-0ef9-482f-8327-648cca221807/Foto. Это с локальной машины (192.168.1.3) забираются фотографии на сервер, для бэкапа, и, заодно, свободного доступа с телевизоров и других компьютеров домашней сети. Для конечной папки, куда синхронизировать - «Foto» - установлены полномочия пользователя/группы «nobody», для свободного доступа. Перед запуском синхронизации, ls -l папки куда бэкапить выдает - drwxr-sr-x+ 16 nobody users <...> Foto а после синхронизации становится - drwx------+ 7 1000 1000 <...> Foto что, соответственно, влечет за собой доступ к этой директории с запросом логина и пароля, что меня не устраивает. Хочется понять, как сделать так, чтобы права «nobody users» конечной папки «Foto» не изменялись после синхронизации. Само подключение rsync создается через вебморду на сервере OpenMediaVault, потому добавить дополнительно команду на смену прав «Foto» после синхронизации не могу... Что-то возможно сделать в моей стуации? Пробовал: гуглить, курить MAN (http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=rsync&category=1)... Доступ на машину откуда бэкапить - home@192.168.1.3 идет через SSH, без ввода пароля (через сертификаты). Буду рад любой помощи, заранее спасибо.

 , ,

Pashtet
()

RSS подписка на новые темы