Tùy chọn .ssh / config tương ứng cho ssh -N là gì


13

Tôi muốn thiết lập một bí danh trong tệp cấu hình của mình có cùng kết quả với lệnh này:

ssh -N devdb -L 1234:127.0.0.1:1234

Mục nhập .ssh / config của tôi cho devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Tôi phải làm gì trong cấu hình trên để không khởi động shell?


+1 cho câu hỏi hay khiến tôi suy nghĩ về cách tạo đường hầm đến những thứ ngẫu nhiên nhanh hơn (tôi không thường xuyên nhớ các công tắc, nhưng tôi thường sử dụng cùng một cổng, chỉ có máy chủ mới thay đổi).
WEBjuju

Câu trả lời:


22

Vì vậy, trong ssh.cOpenSSH 7.6p1, chúng tôi tìm thấy

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

để -Nthực hiện hai điều:

  • các no_shell_flagchỉ xuất hiện trong ssh.cvà chỉ được kích hoạt cho -Whay -Ntùy chọn, nếu không nó sẽ xuất hiện trong một số khối logic liên quan đến ControlPersistvà kiểm tra sự tỉnh táo liên quan đến dĩa nền. Tôi không thấy một cách mà một tùy chọn có thể trực tiếp thiết lập nó.
  • theo readconf.ccác request_ttytương ứng với các RequestTTYtùy chọn chi tiết trong ssh_config(5).

Lá này (ngoài việc vá khỉ OpenSSH và biên dịch lại, hoặc yêu cầu một ssh_configtùy chọn để chuyển đổi no_shell_flagvới ...) một cái gì đó như:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

Về mặt kỹ thuật, nó bắt đầu một shell nhưng shell đó sẽ ngay lập tức thay thế nó bằng catchương trình mà sau đó chặn cho phép cổng chuyển tiếp được sử dụng trong khi đó. catlà di động, nhưng sẽ tiêu thụ đầu vào (nếu có) hoặc có thể thất bại (nếu đầu vào tiêu chuẩn bị đóng). Một lựa chọn khác là chạy một cái gì đó chỉ chặn .


1
+1 để thực hiện trong .ssh/config... hoàn thành tốt!
WEBjuju

Nghiên cứu tuyệt vời về câu trả lời này! Cảm ơn bạn!
màu vàng êm dịu

Tôi thích RemoteCommand exec sleep infinity.
thomas

3

@thrig có câu trả lời đúng dựa trên mong muốn của bạn chỉ làm điều này trong .ssh/config

Người ta cũng có thể cân nhắc sử dụng một chức năng với mặc định để thực hiện các lệnh đường hầm khác nhanh chóng (đặc biệt nếu đường hầm không thay đổi mà chỉ thay đổi máy chủ).


sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is `sshn` and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

Dưới đây là ba ví dụ về nó được sử dụng: không có đối số mặc định được chỉ định trong hàm được sử dụng:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

với mặc định đường hầm, chạy trên một máy chủ khác:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

với cả hai mặc định, hãy chạy toàn bộ một lần đến máy chủ / đường hầm mới:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

Một lệnh từ xa hữu ích hơn dựa trên câu trả lời của @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

Các read -r -d '' _sẽ chặn các kết nối đến khi người dùng bấm control+c.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.