用於 ssh 設定中命令的 Ovveride shell (~/.ssh/config)

用於 ssh 設定中命令的 Ovveride shell (~/.ssh/config)

所以我有一個供我的用戶使用的 ssh 配置文件,Match exec用於獲取 IP 上的一些匹配項:

Match exec "echo %h | grepcidr 192.168.12.0/20  &>/dev/null "
  User         ubuntu
  ProxyCommand          ssh my-bastion -W %h:%
  IdentityFile          ~/.ssh/target.pem

這在我的主機上運行良好,但我嘗試在安裝了 openssh-client 的容器上啟動它,但是 ssh 連接失敗,因為它認為命令已成功(即使我沒有針對網絡) ,所以它會嘗試穿過堡壘

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 0

在我的主機上它返回

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 1

這應該是容器 ssh 命令返回的內容

我一直在挖掘,結果發現容器中的 ssh 命令是使用啟動的,sh -c而在我的主機上啟動的 ssh 命令是bash -c 我可以通過在命令行上測試並檢查返回的結果來確認這是原因命令與echo $?

有沒有辦法指定 ssh 指令只使用bash

我可以覆蓋SHELL命令列開頭的環境變量

SHELL=/bin/bash ssh [email protected]

但我的目標是在這一切背後使用 ansible,所以我想為所有 SSH 覆蓋 shell。

答案1

您可以指定以 開頭的替代指令bash -c,或刪除 Bashism(即&>stdout-and-stderr 重新導向)。

Match exec使用類似於 C 函數的東西system(),因此由運行時系統(C 庫)決定它提供哪個 shell。在大多數 Unix 系統上,它會翻譯為sh -c加上整個命令列。你無法改變這部分。

相關內容