Изменение каталога удаленной машины через ssh после выполнения ~./bashrc

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

С GNUawk(или mawk, но не nawk, который не любит регулярные выражения в качестве разделителей записей):

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
  • RS=" *|\n"устанавливает в качестве разделителя записей два или более пробела или новую строку. Это разбивает Total: 44.75TB Used: 0.44TBна две записи: Total: 44.75TBи Used: 0.44TB.
  • FS=": ?"устанавливает в качестве разделителя полей двоеточие, за которым может следовать пробел. Это разбивает Used: 0.44TBна два поля: Usedи 0.44TB.
  • ORS=" "устанавливает разделитель записей вывода на пробел.

Код awkпросто печатает второе поле каждой записи, разделенное символом ORS, и заканчивает выводом новой строки.

Если вы хотите удалить из этого все, что не является числом, просто пропустите его черезtr -dc '0-9. \n':

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07

tr -dc '0-9. \n'удалит все, что не является цифрой, точкой, пробелом или новой строкой.

0
19.07.2019, 15:46
2 ответа

My problem is that the way the command is written the change of directory happens before the ~./bashrc is even executed

Более вероятно, что ~/.bashrcвообще не читается. Bash читает ~/.bashrc, только если он вызывается как интерактивная(не -логин )оболочка. Когда вы даете команду для запуска в командной строке ssh, она выполняет оболочку с параметром -c, что делает ее не -интерактивной.

Но это можно обойти, найдя .bashrcвручную:

ssh -t user@server '. ~/.bashrc; cd dir; exec bash'

Некоторые bashrcфайлы проверяют, является ли оболочка интерактивной, и вносят изменения только в том случае, если это так.(Это звучит ненужно, так как bashrcчитается только из интерактивной оболочки, но из-за того, как работают файлы запуска Bash, bashrcтакже часто берется из .bash_profileили его эквивалента.)

Чтобы обойти это, вам нужно принудительно вызвать интерактивный вызов Bash, например:

ssh -t user@server 'bash -ic "cd /tmp; exec bash"'

В ручном поиске .bashrcтеперь нет необходимости, поскольку -iBash делает это сам. Второй второй Bash (изexec bash)также делает это, поэтому, если это проблема, замените последнюю часть на exec bash --norc.

...

Вероятно, было бы неплохо разделить соответствующую настройку в другой файл (, скажем,.thingy.rc).Затем источник этого из .bashrc(, если необходимо )и из команды SSH вместо .bashrc.

1
28.01.2020, 02:39

Как насчет документа здесь , примерно как ниже:

ssh user@server << EOF exec bash       
cd dir
EOF
0
28.01.2020, 02:39

Теги

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