SSH thoát sau khi thoát trường hợp trong tập lệnh bash


2

Vì vậy, tôi có kịch bản tiêu chuẩn sau:

    #!/bin/bash
    PS3='Please enter your choice: '
    options=("option 1" "Option 2" "Option 3" "Quit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Option 1")
                echo "you chose choice 1"
                ;;
            "Option 2")
                echo "you chose choice 2"
                ;;
            "Option 3")
                echo "you chose choice 3"
                ;;
            "Quit")
                break
                ;;
            *) echo invalid option;;
        esac
    done

Nhưng khi tôi chạy tập lệnh thông qua SSH và chọn tùy chọn Thoát, SSH cũng thoát. Điều gì có thể gây ra vấn đề? Tôi chỉ muốn thoát khỏi tập lệnh và tiếp tục làm việc trong SSH.

Vâng, vấn đề nằm ở tệp .bash_aliases mà tôi đã thảo luận dưới đây. Tôi đã được đặt exectrước kịch bản. Khi tôi gỡ bỏ nó và chạy lệnh, mọi thứ đều ổn.


Bạn đang chạy tập lệnh cục bộ trên máy chủ từ xa hay sao?
Rahul Patil

2
Khi bạn chạy tập lệnh, nó giống như lệnh, ssh user@ip commandnó sẽ thực thi và thoát
Rahul Patil

Tôi đang chạy một tập lệnh nằm trên máy chủ Ubuntu từ xa. Đầu tiên tôi đăng nhập bằng SSH và sau đó tôi chạy tập lệnh - chỉ cần nhập đường dẫn và tên tập lệnh ..
ispasov

Câu trả lời:


1

Dựa trên hành vi bạn mô tả có vẻ như bạn đang chạy tập lệnh của mình như vậy:

$ ssh remote picker.bash

Thí dụ

Khi tôi sshvào một hệ thống từ xa, nó hoạt động như mong đợi, chủ yếu là tôi ở lại máy chủ từ xa khi tập lệnh đã hoàn thành.

Nói rằng tôi có 2 máy tính, remotey và lappy. Chúng tôi sẽ biểu thị họ bằng cách sử dụng "L" cho lappy và "R" cho remotey.

L$ ssh remotey

R$ ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4

R$

Tuy nhiên, nếu tôi chạy tập lệnh như thế này, tôi sẽ nhận được hành vi mà bạn mô tả nơi sshthiết bị đầu cuối biến mất:

L$ ssh remotey ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4

L$

Trước khi tôi chạy kịch bản, tôi có một số thao tác cần làm. Vì vậy, tôi đăng nhập bằng ssh username @ server, sau đó tôi thực hiện tải xuống một số tệp trên máy chủ từ xa và sau đó tôi chạy tập lệnh - Tôi viết đường dẫn và tên của tập lệnh. Và sau đó các ssh thoát.
ispasov

@ispasov - OK đó là những gì tôi nghĩ nhưng hành vi nghe có vẻ như trên. Bạn có thể chia sẻ phần còn lại của tập lệnh trên máy chủ Ubuntu không. Có một cái gì đó khác trong kịch bản bên cạnh phần trên đang khiến nó thoát ra.
slm

@sim Đây là toàn bộ kịch bản. Tôi chỉ kiểm tra nó trước khi thêm nhiều lệnh vào nó và tôi nhận được hành vi kỳ lạ này.
ispasov

@ispasov - Tập lệnh không bao gồm #!/bin/bashở trên cùng phải không?
slm

Đúng. Nhưng tôi đã tìm ra giải pháp (sai lầm của tôi). Xin vui lòng xem kết thúc câu trả lời của tôi. Cảm ơn sự giúp đỡ của bạn.
ispasov

1

Bạn có thể bắt đầu một lớp vỏ phụ từ tùy chọn 4, nhưng khi tôi thử nó với 'exec / bin / bash --login', dấu nhắc của lớp vỏ phụ bị mất, khiến cho lớp vỏ từ xa khó sử dụng.

Trang man cho ssh dường như gợi ý rằng bạn có thể chạy shell Xor một lệnh, nhưng không phải cả hai:

SYNOPSIS ssh [nhiều tùy chọn] [user @] tên máy chủ [lệnh] ...

Nếu lệnh được chỉ định, nó được thực thi trên máy chủ từ xa thay vì vỏ đăng nhập.

...

Khi danh tính của người dùng đã được máy chủ chấp nhận, máy chủ sẽ thực thi lệnh đã cho hoặc đăng nhập vào máy và cung cấp cho người dùng một vỏ bình thường trên máy từ xa.

...

Phiên kết thúc khi lệnh hoặc shell trên máy từ xa thoát


1

Nếu bạn chạy ssh remotehost somescriptthì kịch bản chạy và đó là nó. Bạn chỉ nhận được một vỏ tương tác nếu bạn không chỉ định một lệnh từ xa: shell tương tác là lệnh từ xa mặc định. Khi tập lệnh thoát, phiên từ xa kết thúc.

Nếu bạn muốn chạy shell tương tác sau tập lệnh, hãy nói với SSH rằng bạn muốn cả hai. Thêm -ttùy chọn để bạn nhận được một thiết bị đầu cuối trên máy chủ từ xa: theo mặc định, SSH chỉ tạo một thiết bị đầu cuối khi bạn bảo nó chạy một vỏ tương tác, không phải khi bạn chỉ định một lệnh.

ssh -t remotehost '/path/to/script; exec bash'

Lưu ý rằng bất kỳ biến môi trường được xác định trong tập lệnh sẽ không có sẵn. Nếu bạn cần điều đó, thay vào đó hãy tìm tập lệnh trong shell từ xa. Điều này cũng cho phép bạn đóng phiên từ tập lệnh: exittrong tập lệnh sẽ không chỉ thoát tập lệnh mà toàn bộ phiên từ xa vì tất cả chỉ chạy trong một trình bao.

ssh -t remotehost '. /path/to/script; exec bash'

Chà, nếu tôi chạy lệnh như thế này thì SSH không thoát. Nhưng tôi phải đăng nhập vào máy chủ trước, sau đó chạy một số thao tác trước để chạy tập lệnh. Tôi cũng có bí danh bash cho kịch bản. Vì vậy, bạn có thể cho tôi biết làm thế nào để bắt đầu tập lệnh theo cách đó và ngăn SSH thoát ra.
ispasov

@ispasov Nếu bạn chạy SSH và nhận được dấu nhắc shell, sau đó gọi tập lệnh từ dấu nhắc shell đó, thì SSH không thoát.
Gilles

Vấn đề là nó thoát. Làm thế nào để gọi đúng tập lệnh - với tập lệnh sh, tập lệnh exec hoặc chỉ để viết tên của tập lệnh (bash alias)?
ispasov

@ispasov Chính xác thì bạn đang làm gì vậy? Vấn đề là ở một số phần mà bạn không mô tả trong câu hỏi của bạn. Đăng kịch bản hoàn chỉnh và giải thích chính xác cách bạn gọi nó.
Gilles

Trong câu hỏi của tôi, tôi đã đăng toàn bộ kịch bản. Đó là một kịch bản thử nghiệm vì vậy đó là lý do tại sao nó không có bất kỳ tùy chọn nào. Các bước của tôi là: 1. ssh user @ server; 2. Mật khẩu; 3. Tôi đã đăng nhập vào shell của máy chủ và viết đường dẫn và tên của tập lệnh /home/user/bin/script.sh; 4. Khi tôi chọn tùy chọn 4 - Thoát, SSH thoát.
ispasov

0

Vấn đề là ở bash_aliases. Tôi đã phải loại bỏ exectrước khi kịch bản. Vì vậy, bây giờ tệp bash_aliases trông giống như:

command="/path/to/script.sh"

Các execnguyên nhân SSH thoát phiên.

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.