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」を書き込めない場合は機能しません。
コマンドラインを単純化すれば、シェルはおそらく問題になりません。これはおそらくうまくいくはずです
ssh </some/filelist -i /home/user/.ssh/some_key user@freebsd11 xargs -n 1 stat -f \"%N;%c;%m\" | sort
または、sshを実行する特定のユーザーのデフォルトのシェルを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