Сценарий к su-c в экран не работает, как предназначено

вход

$ cat input.txt
Id  sno1  lc1  sno2  lc2    sno3  lc3  sno4 lc4
RM1  98   ss1   88   ms1    78    gs1   45  rs1
RM2  23   ss2   44   ms2    98    gs2   15  rs2
RM3  45   ss3   100  ms3    33    gs3   10  rs3
RM4  45   ss4   45   ms4    12    gs4   11  rs4

сценарий awk

$ cat row_max.awk
NR == 1 {
        for (i = 1; i <= NF; i++) headers[i] = $i;
        next
}

{
        # find maximum value
        max = $2
        for (i = 4; i <= NF; i += 2) if ($i > max) max = $i;
        # print row id
        printf "%s", $1
        # print all lc# column values (assuming the column 
        # after the max value sno# column)
        sep = OFS
        for (i = 2; i <= NF; i += 2) {
                if ($i == max) {
                        printf "%s%s", sep, $(i + 1);
                        sep = ","
                }
        }
        # print all column headers of the max value columns
        sep = OFS
        for (i = 2; i <= NF; i += 2) {
                if ($i == max) {
                        printf "%s%s", sep, headers[i];
                        sep = ","
                }
        }
        printf "\n"
}

вывод

$ awk -f row_max.awk input.txt
RM1 ss1 sno1
RM2 gs2 sno3
RM3 ms3 sno2
RM4 ss4,ms4 sno1,sno2
1
06.01.2019, 15:35
2 ответа

Я недавно столкнулся с этим беспорядком 'матрешки' с ssh+su+screen+rtorrent, таким образом, я думаю, что могу помочь.

Для достижения желаемых результатов, можно использовать;

sudo su -c "script /dev/null -c \"screen -r $2\"" $1

Путем Вы делаете, это теперь только запускается screen после script завершился (через exit, и т.д.), и не имеет абсолютно никакого эффекта на Ваш screen сессия. В методе выше, Вы запускаетесь screen команда в script сессия (script -c). Отметьте завершенное (\") кавычки.

После этих слов Вы все еще делаете его неправильно. В использовании нет никакого смысла sudo и su вместе в этом контексте (я не могу думать ни о каком корректном контексте). Решение состоит в том, чтобы использовать один или другой на основе Вашей реализации.

  1. метод sudo (требует правильно настроенного sudoers файла, может использоваться для обхода входа в систему):
    sudo -u "$1" "script /dev/null -c \"screen -r $2\""
  2. метод su (обычно требует входа в систему, полезный для корня):
    su "$1" -c "script /dev/null -c \"screen -r $2\""

Вся эта информация доступна через man страницы (тип q для выхода). Как новичок, я нахожу их чрезвычайно полезными:

man su; man sudo; man script; man screen

Или просто попросите у программы справки:

su --help; sudo -h; script --help; screen --help

Кроме того, если кто-либо приезжает сюда для rtorrent совета, ответ:

su ${user} -c "script /dev/null -qc \"screen -dr ${session_name}\""

1
27.01.2020, 23:53

То, что Вы делаете:

  1. Выполненный script /dev/null. Это выполняет интерактивную оболочку и помещает расшифровку стенограммы той сессии в /dev/null.
  2. Когда интерактивная оболочка выходит, script завершается и screen запускается.

Я не знаю, почему Вы пытаетесь использовать script здесь, особенно когда Вы не хотите расшифровку стенограммы.

Используя su в sudo избыточно: sudo уже имеет эту функциональность.

sudo -u "$1" screen -r "$2"
0
27.01.2020, 23:53

Теги

Похожие вопросы