登录 FreeBSD ssh 时使用 bash shell

Ors*_*ong 5 freebsd ssh shell bash bsd

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

以下是我在 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"'
Run Code Online (Sandbox Code Playgroud)

FreeBSD 11 上前一个命令的输出似乎是一个 csh 错误消息

Unmatched ".
Run Code Online (Sandbox Code Playgroud)

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

ssh -i /home/user/.ssh/some_key user@freebsd11 'bash -c "echo $0"'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,BSD 系统不允许更改 shell,除非使用 heredoc,但我不能使用 heredoc 发送 cat "/some/filelist" 。

当然,bash已经安装好了,可以执行了。我对更改 FreeBSD 上用户的默认 shell 不感兴趣。

这里有什么想法吗?

我最好的猜测是划分问题:

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'
Run Code Online (Sandbox Code Playgroud)

这个解决方案可以工作,但很混乱,建立 2 个连接而不是一个连接,如果由于某种原因远程无法写入“somefile”,则将无法工作。

小智 3

如果简化命令行,shell 可能就不再重要了。这应该可行

ssh </some/filelist -i /home/user/.ssh/some_key user@freebsd11 xargs -n 1 stat -f \"%N;%c;%m\" | sort
Run Code Online (Sandbox Code Playgroud)

或者,您可能希望将您要通过 ssh 访问的特定用户的默认 shell 更改为 bash - 请参阅 chsh(1) 命令。