Как заставить завершение вкладки bash работать с файловой системой только для чтения?

Из вашего описания того, чего вы пытаетесь достичь, следующий сценарий может быть скриптом, который это делает:

#!/bin/bash

server="${1,,}"

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }' "/home/Lists/srv" )"

if [[ -z "$jumphost" ]] || [[ "$jumphost" == "$server" ]]; then
    ssh -qt "$server" "$2"
else
    ssh -qt "$jumphost" "ssh -qt \"$server\" \"$2\""
fi

Расширение параметра $ {1 ,,} переводит значение $ 1 в нижний регистр. Для более старых версий bash используйте вместо этого следующее:

server="$( printf '%s' "$1" | tr 'A-Z' 'a-z' )"

Для переменной jumphost будет установлено значение, указанное в первом столбце первой строки файла / home / Lists / srv соответствует имени сервера.Обратите внимание, что при этом выбирается только первое совпадение в файле, и что совпадение учитывает целую строку .

Если соответствие должно быть только для второго столбца, измените $ 0 на $ 2 в скрипте Awk.

Если $ jumphost пусто или это то же самое, что и $ server , то будет выбрана первая ветвь, в противном случае - вторая.

Запрошено объяснение сценария Awk:

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }'

С помощью -v можно задать для переменной Awk определенное значение. В приведенной выше команде мы устанавливаем для переменной Awk s значение $ server . Затем эта переменная становится доступной в сценарии Awk.

В сценарии Awk

$0 ~ s { print $1; exit }

код из {...} будет выполняться всякий раз, когда условие $ 0 ~ s истинно. Условие $ 0 ~ s означает « $ 0 соответствует (регулярному выражению) s ». Переменная s - это то, что мы передали в значение $ server , а $ 0 - это содержимое текущей записи (строки), которую только что прочитал Awk. . Короче говоря, он находит в файле строку, содержащую имя сервера.

Чтобы добиться точного совпадения во втором столбце (например), вместо этого можно использовать $ 2 == s в качестве условия.

Код в {...} напечатает $ 1 , которое является первым полем (столбцом) $ 0 (строка), перед ним выходит из скрипта.Я выбираю выход, чтобы мы не сопоставляли более одной строки. Если пользователь указывает слишком неопределенное значение для $ server , в противном случае мы рискуем сопоставить несколько строк.

Наконец, значение, выводимое Awk, будет присвоено переменной оболочки jumphost - $ (...) , что примерно совпадает с `.. .` .

7
03.03.2016, 00:54
1 ответ

Первый тест, который вы можете сделать, чтобы увидеть, где находится ваша папка tmp и есть ли она работает выполнение этой команды:

tempfile

Результат должен быть примерно таким:

/tmp/fileupz962

Если папка / tmp существует и работает (имеет разрешения на запись), но временная папка указывает на другой каталог, например / var / tmp, вы можете попробуйте настроить временную папку так, чтобы она указывала на / tmp, используя:

export TMPDIR=/tmp

Если bash сохраняет временный файл в / tmp и если по какой-то причине папка / tmp не работает, вы можете попытаться размонтировать ее (в случае, если она смонтирована ). Может случиться так, что / tmp монтируется только для чтения. В обоих случаях полезно попробовать:

sudo umount /tmp

Затем вы можете попробовать использовать хранилище RAM для каталога / tmp:

sudo mount -t tmpfs -o size=128M tmpfs /tmp/ram/

Вы можете установить для объема RAM (-o size = 128M) любое значение, которое хотите.

1
27.01.2020, 20:20

Теги

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