Ssh

登錄 FreeBSD ssh 時使用 bash shell

  • December 9, 2016

我正在尋找一種方法來確保我的命令在某些使用 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

引用自:https://serverfault.com/questions/819615