Usando o shell bash ao efetuar login no FreeBSD ssh

5

Estou procurando uma maneira de ter certeza de que meus comandos são executados pelo bash em algumas máquinas do FreeBSD 11 que usam o csh como shell padrão.

O seguinte é o meu código que funciona no Linux CentOS / Debian / MacOS X / pfSense 2.3 (rodando no FreeBSD 10.3) e até mesmo no Windows 10, mas não funciona no 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"'

A saída do comando anterior no FreeBSD 11 parece ser uma mensagem de erro csh

Unmatched ".

Ao verificar qual shell é executado, parece que o csh é executado. Os seguintes retornos 'csh'

ssh -i /home/user/.ssh/some_key user@freebsd11 'bash -c "echo $0"'

A partir do meu entendimento, os sistemas BSD não permitem a troca de shell, a menos que se use um heredoc, mas não consigo enviar cat "/ some / filelist" usando um heredoc.

Claro, o bash está instalado e pode ser executado. Eu não estou interessado em mudar o shell padrão dos usuários no FreeBSD.

Alguma ideia aqui?

Meu melhor palpite seria dividir o problema:

1 / envie o arquivo com cat /some/filelist | ssh [..] 'cat > somefile'

2 / use o arquivo enviado em um heredoc

ssh [..] 'bash -s' << 'EOF'
while read -r file; do stat -f "%N;%c;%m" "$file" | sort; done < "$somefile"
'EOF'

Esta solução pode funcionar, mas é confusa, faz 2 conexões em vez de uma e não funcionará se o controle remoto não puder gravar o 'somefile' por algum motivo.

    
por deajan 08.12.2016 / 19:12

2 respostas

3

Se você simplificar sua linha de comando, o shell provavelmente não importará. Isso provavelmente deve funcionar

ssh </some/filelist -i /home/user/.ssh/some_key user@freebsd11 xargs -n 1 stat -f \"%N;%c;%m\" | sort

Alternativamente, você pode querer mudar o shell padrão para bash para o usuário em particular que você está ssh-ing - veja o comando chsh (1).

    
por 09.12.2016 / 06:04
2

Use ansible . Você não precisa adicionar nenhum software adicional nas máquinas de destino e, possivelmente, simplifica o que você precisa fazer. ansible usa o padrão ssh para se conectar às máquinas, sudo , pfexec ou doas estão disponíveis se você precisa executar com privilégios , e você pode escolher com qual usuário se conectar e qual usuário executar como.

Se a tarefa real for realizar stat em uma lista de arquivos, já existe um módulo para isso e uma pesquisa para iterar as linhas de um arquivo :

---
- hosts: freebsd11:pfsense
  gather_facts: yes
  tasks:

  - name: stat a list of files
    stat: "{{ item }}"
    with_lines:
     - cat /path/to/list_of_files

Se a tarefa for um comando shell arbitrário que precisa ser executado na máquina de destino usando bash , também há um módulo para isso :

---
- hosts: freebsd11:pfsense
  gather_facts: yes
  tasks:

  - name: execute shell script using bash
    shell: cat < /tmp/*txt
      args:
        executable: /bin/bash
    
por 08.12.2016 / 21:57