Использование оболочки bash при входе в FreeBSD ssh
Я ищу способ убедиться, что мои команды выполняются bash на некоторых машинах FreeBSD 11, которые используют csh в качестве оболочки по умолчанию.
Ниже приведен мой код, который работает в Linux CentOS / Debian / MacOS X / pfSense 2.3 (работает на FreeBSD 10.3) и даже на Windows 10 bash, но не работает на FreeBSD 11
cat "/some/filelist" | ssh -i "/home/user/.ssh/some_key" user@freebsd11 'bash -c "while read -r file; do stat -f \"%N;%c;%m\" \"\$file\"; done | sort"'
Вывод предыдущей команды во FreeBSD 11 выглядит как сообщение об ошибке csh
Unmatched ".
При проверке, какая оболочка запускается, кажется, что запускается csh. Следующее возвращает 'csh'
ssh -i /home/user/.ssh/some_key user@freebsd11 'bash -c "echo $0"'
Насколько я понимаю, системы BSD не позволяют изменять оболочку, если только не используется heredoc, но я не могу отправить cat "/some/filelist", используя heredoc.
Конечно, bash установлен и может быть выполнен. Я не заинтересован в изменении оболочки по умолчанию для пользователей FreeBSD.
Есть идеи здесь?
Мое лучшее предположение было бы разделить проблему:
1 / отправить файл с cat /some/filelist | ssh [..] 'cat > somefile'
2/ использовать отправленный файл в heredoc
ssh [..] 'bash -s' << 'EOF'
while read -r file; do stat -f "%N;%c;%m" "$file" | sort; done < "$somefile"
'EOF'
Это решение может работать, но оно грязное, создает 2 соединения вместо одного и не будет работать, если по какой-то причине удаленный не может написать "somefile".
2 ответа
Если вы упростите командную строку, оболочка, скорее всего, не будет иметь значения. Это должно работать
ssh </some/filelist -i /home/user/.ssh/some_key user@freebsd11 xargs -n 1 stat -f \"%N;%c;%m\" | sort
В качестве альтернативы вы можете изменить оболочку по умолчанию на bash для конкретного пользователя, с которым вы работаете, - см. Команду chsh(1).
Использование ansible
, Вам не нужно добавлять какое-либо дополнительное программное обеспечение на целевые машины, и, возможно, это упрощает то, что вам нужно сделать. ansible
использует стандарт ssh
подключиться к машинам, sudo
, pfexec
или же doas
доступны, если вам нужно работать с привилегиями, и вы можете выбрать, к какому пользователю подключаться и какому пользователю выполнять.
Если реальная задача заключается в выполнении stat
в списке файлов уже есть модуль для этого и поиск для перебора строк файла:
---
- hosts: freebsd11:pfsense
gather_facts: yes
tasks:
- name: stat a list of files
stat: "{{ item }}"
with_lines:
- cat /path/to/list_of_files
Если задача является произвольной командой оболочки, которую необходимо выполнить на целевой машине, используя bash
есть также модуль для этого:
---
- hosts: freebsd11:pfsense
gather_facts: yes
tasks:
- name: execute shell script using bash
shell: cat < /tmp/*txt
args:
executable: /bin/bash