Tìm IP hoặc tên máy chủ của máy gốc (ssh)


10

Tôi kết nối với một số máy liên tục, từ các vị trí vật lý khác nhau (và do đó là các máy vật lý khác nhau). Hầu hết trong số này được thực hiện mặc dù ssh, đôi khi một máy gateway hoặc hai là cần thiết (mà tôi invoke qua ProxyCommandtrong ~/.ssh/config). Tôi muốn biết liệu có một phương pháp để xác định IP hoặc tên máy chủ của máy gọi kết nối ban đầu (tức là máy tôi đang làm việc) ở đầu xa không?

  • Tôi không muốn gửi các biến môi trường vì một số máy tôi không có root để đặt PermitUserEnvironment.
  • Biến $SSH_CLIENTmôi trường hữu ích cho các kết nối trực tiếp, nhưng chỉ liệt kê các cổng gần đây nhất.

Ý tưởng hiện tại của tôi cho một giải pháp là lấy $SSH_CLIENT, ssh cho nó, tìm $SSH_CLIENTgiá trị của máy đó và lặp lại cho đến khi nó không tồn tại; sau đó lấy tên máy chủ và kéo nó trở lại bằng cách nào đó.

Có vẻ như một chút của một công việc hack mặc dù; Có ai có một phương pháp tốt hơn?

Tôi đang làm việc trong một bash shell, nhưng tôi cũng rất vui vì bất kỳ đề xuất nào không sử dụng nó.


Tất nhiên, một trong những mục đích của ProxyCommand là ẩn (hoặc quên) máy chủ gốc (ví dụ có thể không thể định tuyến được từ máy chủ cuối cùng)
Hagen von Eitzen

Bạn có thể đưa ra một ví dụ ở đâu hoặc tại sao bạn cần thông tin này? Có thể có những giải pháp không rõ ràng khác.
Manwe

@Manwe Cuối cùng tôi sẽ muốn thiết lập các phần cụ thể của miền địa phương trong những thứ như .bashrc của tôi. Ngay bây giờ tất cả những gì tôi muốn làm là tự động đặt một trong ba bố trí bàn phím trong vim tùy thuộc vào máy tôi đang làm việc.
Trắc địa

Câu trả lời:


3

Tôi chưa bao giờ thử, nhưng tôi có thể nghĩ ra một thứ có thể hoạt động: Bạn không để SSH khởi động trình đăng nhập của mình mà hãy xử lý các vấn đề trong tay của chính bạn. Bạn có thể yêu cầu SSH chạy các lệnh tùy ý. Thay vì

ssh remote_host

bạn sẽ chạy một cái gì đó dọc theo dòng

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

Những gì nó làm là, nó cung cấp cho SSH một cái gì đó khác để làm thay vì khởi chạy một vỏ đăng nhập. Rằng một cái gì đó là một chuỗi, sẽ được chạy dưới dạng lệnh, từ xa. Chúng tôi sử dụng điều này để khởi chạy shell theo cách rất đặc biệt: chúng tôi cung cấp cho nó một biến môi trường DAT_ORIGIN_HOST, có chứa ip của chúng tôi trên eth0 (bạn có thể cần phải thay đổi điều đó).

Thủ thuật chúng tôi thực hiện là chúng tôi đặt lệnh để thực thi từ xa trong hai lần ". Dấu ngoặc kép (ít nhất là trong Bash) có nghĩa là TRƯỚC KHI CHUẨN BỊ ĐƯỢC THAM GIA VÀO SSH, shell của chúng tôi quét nó và thực hiện mở rộng / thay thế, khi thích hợp. Điều này có nghĩa là shell của chúng ta sẽ đánh giá phần `$ (ifconfig ...), đến địa chỉ IP hiện tại của chúng ta và truyền ssh một chuỗi chứa định nghĩa cho biến môi trường với địa chỉ ip cục bộ của chúng ta.

Sau khi đăng nhập vào máy từ xa, echo $DAT_ORIGIN_HOSTnên in địa chỉ IP của bạn.

Để phát triển cuộc gọi đó tới SSH, tôi đã lấy từ đây một cách đáng xấu hổ để trích xuất địa chỉ IPở đây cho -t và cách khởi chạy một cái gì đó tương tác

Tuyên bố miễn trừ trách nhiệm: Tôi không chắc chắn về -l-itùy chọn /bin/bash. Có lẽ bạn cần bỏ qua chúng.


Bạn có thể đang ở một cái gì đó ở đây! Tôi sẽ chơi xung quanh với nó một chút và lấy lại cho bạn.
Trắc địa

Tôi đang đánh dấu câu trả lời này, vì các lệnh giả và lệnh từ xa đều hoạt động. Cuối cùng tôi đã giải quyết trường hợp cụ thể của mình bằng ^ E gọi lại, dựa trên đề xuất lệnh từ xa - cuối cùng nó sẽ sạch hơn và sử dụng chung một chút. Cảm ơn!
Trắc địa

2

Id tôi hiểu chính xác bạn đang kết nối trực tiếp từ máy gốc đến đích với proxycommandbước nhảy. Và đây là ba bản hack dành cho bạn (được thêm vào thứ ba sau khi nhận xét về kịch bản sử dụng). Đầu tiên) Sử dụng chuyển tiếp cổng từ xa để cho phép bạn quay lại máy gốc với-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

Thứ hai) Lạm dụng AcceptEnv LC_*vào mục tiêu. Điều này không hay nhưng nó khá phổ biến khi cho phép các biến LOCALE thậm chí còn có cả AcceptUserEnviconment không khả dụng. Vì vậy, bây giờ bạn có thể làm:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

Thứ ba) Sử dụng ssh từ xa chuyển tiếp để xác định loại máy chủ hoặc loại máy chủ.

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

Bây giờ kết nối với chuyển tiếp cổng:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target

Cảm ơn những lời đề nghị, nhưng chưa làm tôi hài lòng hoàn toàn. Chuyển tiếp cổng từ xa không phải là một ý tưởng tồi, nhưng một giả định cần thiết là bạn có cùng tên người dùng trên tất cả các máy chủ. Đó không phải là trường hợp ở đây cũng không phải là điều tôi có thể thay đổi. Thứ hai: Tôi không thể làm việc này. Bạn đang nói rằng AcceptEnv LC_*nói chung cho phép, nhưng không phải là một tiêu chuẩn, trên bằng cách thiết lập mặc định?
Trắc địa

Vâng, LC_ bị trúng và bỏ lỡ. Tôi không thể nhận xét mức độ phổ biến của nó, nhưng đó là thứ có thể hoạt động .. (hãy nhớ xuất LC_SOURCEHOST trước khi kết nối ssh).
Manwe

Đã kiểm tra LC_ * và nó hoạt động. Nó có thể là bất kỳ biến được liệt kê trong AcceptEnvchỉ thị trong /etc/ssh/sshd_config. Nhớ khởi động lại sshdnếu tập tin này được thay đổi.
david.perez

1

Bạn có thể nhập who -mvào đầu từ xa để lấy thông tin về người dùng hiện đang đăng nhập (bao gồm cả tên máy chủ). whocung cấp cho bạn thông tin về người dùng đã đăng nhập và công -mtắc hiển thị cho bạn "chỉ tên máy chủ và người dùng được liên kết với stdin".


Điều này chỉ hữu ích nếu tôi không đào hầm qua máy gateway.
Trắc địa

0

bạn đã thử như sau?

 netstat -an | grep " 22 "

Phương pháp này chỉ hữu ích cho các kết nối một bước nhảy, vì vậy không hữu ích cho tôi.
Trắc địa
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.