LINUX.ORG.RU

Сообщения balzi

 

ZSH и autocomplete

Всем здравствуйте.

Вопрос к опытным юзерам zsh. 1)Сейчас, при добивании TAB-ом получается так:

 ~$ git add                                                                                                                                                                                     
add                -- add file contents to index
am                 -- apply patches from a mailbox
apply              -- apply patch to files and/or to index
archimport         -- import an Arch repository into git
archive            -- create archive of files from named tree
...

Можно ли поменять такое поведение на что-то около:

 ~$ git add                                                                                                                                                                                     
add  am  apply  archimport  archive ...
...
т.е. без описания?

2)При вводе команды при помощи плагина «zsh-autosuggestions» выводится недостающая часть команды на основе истории. Например, ввожу

«sc»

получаю дополнение вида

«screen -x vpn»

при нажатии стрелки вправо перескакиваю в конец фразы

«screen -x vpn^»

Можно ли изменить поведение работы и при нажатии стрелки перемещаться по строке «пословно», т.е. примерно так:

"screen^ -x vpn"
"screen -x^ vpn"
"screen -x vpn^"

Всем заранее спасибо.

 ,

balzi
()

Работа с LVM и их снапшотами

Здравствуйте.

Решил установить себе Ubuntu 20.04 на 480ГБ SSD через LVM-ы.

Разбивка такая: /boot 1 Gb ext2 VG (local) - 460 Gb / - 100 Gb ext4 /home - 105 Gb ext4 swap - 5 Gb

Честно говоря, делал это только с одной целью - при надобности, перед тем как что-то ломать, делать снапшот, а затем ресторить его.

И все хорошо, создаю снапшот через

lvcreate -s
точно такого же размера, как и изначальный раздел, т.е., например, пускай это будет / (называется root). Но вот когда доходит дело до восстановления - я теряюсь. Делаю так (с LiveCD)
cat /dev/local/root_snap > /dev/local/root
и вроде восстанавливается. Но. 1) Я практически уверен, что это неправильно. Как лучше это делать? 2) Увы, я видимо, не совсем понимаю, как работают снапшоты. Насколько я понял, создается какая-то CoW прослойка, которая затем позволяет два снапшота смерджить в один, если это будет нужно. Но, как я не искал, никакого подробного описания о работе снапшотов в частности и LVM в целом так и не нашел =( Буду очень благодарен тому, кто сможет подкинуть годное чтиво. 3) При создании снапшота у него есть атрибут свидетельствующий о том, что это снапшот и, соответственно, Origin LVM. Можно ли каким-то образом перевести snapshot в полноценный LVM?

За любые замечания и комментарии буду крайне благодарен.

 , ,

balzi
()

Systemd сервис и вход по ssh

Использую Ubuntu 16.04 Написал собственный скрипт, который выполняет нужные мне команды на группе серверов.

В скрипте есть часть кода:

    for serv in ${SERVERS[@]}
      do
        TEST=$(ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SSH_USER}@${serv}.${HOST} "sudo su - root -c 'cat /root/test.txt'")
        echo $TEST ====
    done

Конечно, ${SSH_USER} , ${serv} и ${HOST} заданы и скрипт отлично работает когда его выполнить так:

$ /bin/bash /path/to/script.sh

Но он должен запускаться каждый раз, когда я включаю ноутбук. Соответственно я решил написать свой systemd сервис для своего пользователя и положил его в .config/systemd/user/. Выглядит он так:

    [Unit]
    Description=service-name
    After=multi-user.target
    
    [Service]
    Type=simple
    EnvironmentFile=%h/.config/systemd/user/default/service-name
    ExecStart=/bin/bash %h/${SCRIPT_DIR}/service-name 
    TimeoutSec=10
    
    [Install]
    WantedBy=default.target

Но сервис не работает, как задумывалось. Когда я его запускаю вот так:
$ systemctl start --user service-name сервис стартует, но скрипт не может выполнить вход на серверы.

В syslog такая картина:

    ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
    Permission denied, please try again.

Я думаю, проблема в том, что вход на серверы настроен через RSA-key, a мой RSA-key защищен при помощи passphrase. И в этом случае мой ssh-agent, по каким-то причинам, не работает. Я пытался экспортировать $SSH_AUTH_SOCK в мой скрипт. Также пытался задать ее вручную. Увы, безуспешно.

Также, я не могу понять какой ssh-agent используется.

    $ echo $SSH_AUTH_SOCK
    /run/user/1000/keyring/ssh

но

    $ps auSfx | grep [a]gent
    user  1399  0.0  0.0 168036   592 ?        Ss   12:34   0:00          \_ gpg-agent --homedir /home/user/.gnupg --use-standard-socket --daemon

и его сокет:

    $lsof -p 1399
    
    COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
    gpg-agent 1399 user  cwd    DIR                8,5     4096       2 /
    ....
    gpg-agent 1399 user    3u  unix 0xffff96fcbde83c00      0t0   25282 /home/user/.gnupg/S.gpg-agent type=STREAM

я определял /home/user/.gnupg/S.gpg-agent как переменную SSH_AUTH_SOCK , но в таком случае ключ не определяется вообще.

Вопросы:

  1. Как можно решить эту проблему?;
  2. Возможно есть путь лучше?
  3. Какой все-таки ssh-agent используется?

Спасибо.

 , , ,

balzi
()

Systemd и not absolute path

Здравствуйте.

Ubuntu 16.04

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

Сам сервис такого вида:

[Unit]
Description=service-name
After=multi-user.target

[Service]
Type=simple
EnvironmentFile=~/.config/systemd/user/default/service-name
ExecStart=/bin/bash ~/${SCRIPT_DIR}/script.sh 
TimeoutSec=10

[Install]
WantedBy=default.target

EnvironmentFile достаточно простой:

DISPLAY=:0
SCRIPT_DIR="path/to/dir"

Понятное дело, systemd шлет меня лесом, выдавая

[/home/user/.config/systemd/user/service-name.service:7] Path '~/.config/systemd/user/default/service-name' is not absolute, ignoring.

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

За любые советы/замечания заранее благодарен.

 ,

balzi
()

Управление выходом со скрипта и цикла, вывод сообщения.

Здравствуйте. Есть два скрипта.

script1.sh :

#!/bin/bash

while true
do

  echo -e "
  Available category:
  \t\t\t1. script2.sh"
  

  wrong_count=0

  while true
  do
    read -p "Enter number of needed category: " choosen_category
    case "$choosen_category" in
      "1" ) ./script2.sh
            wrong_count=0
      ;;
      * ) if [ $wrong_count = "2" ]
          then
            echo "ERROR! You entered wrong argument 3 times. Return to the previous menu"
            break
          else
            echo "Wrong argument. Try again." 
            wrong_count=$[ $wrong_count + 1 ]
          fi
      ;;
    esac

  done

done

И, второй, вызываемый в первом:

script2.sh :

#!/bin/bash

while true
do

  #Clear screen 
  echo -en "\ec"

 
  echo -e "
  Available function:
  \t\t\t1. Function1
  \t\t\t2. Exit\n\n"

  wrong_count=0

  while true
  do
    read -p "Enter number of needed function: " choosen_function
    case "$choosen_function" in
      "1" ) echo "Function1"
            wrong_count=0
      ;;
      "2" ) exit;;
      * ) if [ $wrong_count = "2" ]
          then
            echo "ERROR! You entered wrong argument 3 times. Return to the previous menu"
            break
          else
            echo "Wrong argument. Try again." 
            wrong_count=$[ $wrong_count + 1 ]
          fi
      ;;
    esac
  done
done

Есть несколько вопросов:
1)Когда в srcipt2.sh отрабатывает exit, я возвращаюсь в sript1.sh на этап «read -p „Enter number of needed.....“ , что вполне логично, из-за второго цикла while. Можно ли сделать так, что бы при выходе со script2.sh я попадал в начало скрипта script1.sh или же нужно только убирать лишний while? Меня „exit“ на „break 2“ и на „exit && break“. Увы, результата это не дало

2)Можно ли в script2.sh выводить сообщение „ERROR! You entered wrong argument 3 times. Return to the previous menu“ после очистки экрана без дополнительной переменной? Или же нужно только создавать дополнительную переменную, например $error_message и выводить ее после очистки, если она не пустая?

 ,

balzi
()

Apache mpm_prefork

Здравствуйте.

Возникла необходимость поднять веб-сервер с несколькими сайтами и отдельными пользователями для них.

Пока что установил apache в режиме mpm-prefork. Однако, когда дошло до тестирования установки CMS на сайт, выяснилось, что нормально все будет работать только при правах 775 на папку. При это права такие:

drwxrwxr-x 5 test test 4,0K Apr 15 00:22 test.com

а пользователь «apache» от имени которого запускается сам Apache (логично) добавлен в группу «test» Посему вопрос. Есть ли возможность как-либо добавлять юзеров, возможно, с применением групп, так, чтобы не давать лишних прав на папку. Или же с prefork только вариант, уже найденный мной, а если нужны права 755, то тут нужно использовать mpm-itk и прописывать в апаче AssignUserId ?

Если кого-то есть свое виденье решения проблемы - буду рад услышать.

Спасибо.

 , ,

balzi
()

Разбор кода на bash

Здравствуйте. Для маленького проекта понадобилось найти что-то вроде шаблонизарота на bash. Его я нашел, вот код:

   #!/bin/bash
   config_file='test.conf'
   template_file='mytemplate'
   myvar1='variable 1'
   template=`cat ${template_file}`
   eval "echo \"${template}\"" > ${config_file}

(Источник)

Код работает, проблем с ним нет. Однако, хотелось бы понять, как он работает.

Читал про eval - не совсем понял, почему он в данном случае работает так (в текст подставляет значение переменной). Также, не совсем понятно для чего после знакана переменной, а именно «$» имя переменной берут в фигурные скобки {}. Есть ли отличие от простого $var_name

Заранее спасибо.

 , ,

balzi
()

Интерактивные уведомления через bash

Использую Linux Mint MATE. Появилась необходимость создавать уведомления с кнопкой. Как я понимаю, в простом notify-send такой функции нет. Нашел информацию о zenity - не совсем то, что мне нужно. Видел в интернете упоминания, что такие функции может выполнять встроенное в оболочку приложение. Подскажите, пожалуйста, как реализовать подобные notification?

 ,

balzi
()

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