loginFreeBSD ssh时使用bash shell

我正在寻找一种方法来确保我的命令是由bash在一些使用csh作为默认shell的FreeBSD 11机器上执行的。

以下是我在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 ". 

在检查运行哪个shell时,似乎csh运行。 以下返回'csh'

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

至于我的理解,BSD系统不允许更改shell,除非使用heredoc,但是我不能使用heredoc发送cat“/ some / filelist”。

当然,bash已经安装并可以执行了。 我不想改变FreeBSD用户的默认shell。

这里有什么想法?

我最好的猜测是分解这个问题:

1 /用cat /some/filelist | ssh [..] 'cat > somefile'发送文件 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' 

这个解决scheme可以工作,但是很麻烦,使2连接而不是一个,如果由于某种原因远程不能写'somefile'将不会工作。

如果你简化你的命令行,shell可能不会有问题。 这应该可能工作

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

或者,您可能希望将默认的shell更改为bsh,以供您正在访问的特定用户使用 – 请参阅chsh(1)命令。

使用ansible 。 您不需要在目标机器上添加任何额外的软件,可以说,它简化了您需要做的事情。 ansible使用标准的ssh连接到机器, sudopfexecdoas是可用的,如果您需要以特权运行 ,您可以select连接哪个用户,以及执行哪个用户。

如果实际的任务是在文件列表上执行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执行的任意shell命令, 那么还有一个模块 :

 --- - hosts: freebsd11:pfsense gather_facts: yes tasks: - name: execute shell script using bash shell: cat < /tmp/*txt args: executable: /bin/bash