web-dev-qa-db-ja.com

FreeBSDsshにログインするときにbashシェルを使用する

Cshをデフォルトのシェルとして使用する一部のFreeBSD11マシンで、コマンドがbashによって実行されることを確認する方法を探しています。

以下は、Linux CentOS/Debian/MacOS X/pfSense 2.3(FreeBSD 10.3で実行)およびWindows 10 bashで動作するが、FreeBSD11では動作しない私のコードです。

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システムではシェルの変更は許可されていませんが、ヒアドキュメントを使用して猫「/ some/filelist」を送信することはできません。

もちろん、bashはインストールされて実行できます。 FreeBSDのユーザーのデフォルトのシェルを変更することに興味はありません。

ここに何かアイデアはありますか?

私の最善の推測は、問題を分割することです。

1/cat /some/filelist | ssh [..] 'cat > somefile'でファイルを送信します

2 /送信されたファイルをヒアドキュメントで使用する

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

このソリューションは機能する可能性がありますが、面倒で、1つではなく2つの接続を確立し、リモートが何らかの理由で「somefile」を書き込めない場合は機能しません。

5
Orsiris de Jong

コマンドラインを単純化すれば、シェルはおそらく問題になりません。これはおそらくうまくいくはずです

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

または、sshを実行する特定のユーザーのデフォルトのシェルをbashに変更することもできます。chsh(1)コマンドを参照してください。

3
John Sellens

ansible を使用します。ターゲットマシンにソフトウェアを追加する必要はなく、間違いなく、必要な作業が簡素化されます。 ansibleは標準のsshを使用してマシンに接続します。必要に応じて、 Sudopfexec、または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
2
dawud