Из вашего описания того, чего вы пытаетесь достичь, следующий сценарий может быть скриптом, который это делает:
#!/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
- $ (...)
, что примерно совпадает с `.. .`
.
Первый тест, который вы можете сделать, чтобы увидеть, где находится ваша папка 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) любое значение, которое хотите.