登錄 FreeBSD ssh 時使用 bash shell
我正在尋找一種方法來確保我的命令在某些使用 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"'
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'
2/ 在 heredoc 中使用發送的文件
ssh [..] 'bash -s' << 'EOF' while read -r file; do stat -f "%N;%c;%m" "$file" | sort; done < "$somefile" 'EOF'
這個解決方案可以工作,但很混亂,建立 2 個連接而不是一個,如果遠端由於某種原因無法寫入“somefile”,則該解決方案將無法工作。
如果您簡化命令行,shell 可能無關緊要。這應該可以工作
ssh </some/filelist -i /home/user/.ssh/some_key user@freebsd11 xargs -n 1 stat -f \"%N;%c;%m\" | sort
或者,您可能希望將預設 shell 更改為 bash,以用於 ssh 到的特定使用者 - 請參閱 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
如果任務是需要在目標機器上執行的任意 shell 命令
bash
,那麼還有一個模組:--- - hosts: freebsd11:pfsense gather_facts: yes tasks: - name: execute shell script using bash shell: cat < /tmp/*txt args: executable: /bin/bash