bash shell - ssh tập lệnh từ xa bắt đầu ra và thoát mã?


23

Tôi muốn sử dụng shell để gọi một tập lệnh trên một máy chủ từ xa. Tôi muốn nắm bắt đầu ra của tập lệnh đó (thông điệp đăng nhập của nó) và mã thoát mà nó trả về.

Nếu tôi làm điều này:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

Tôi nhận được mã thoát nhưng không thể chụp các thông điệp đăng nhập từ xa.

Nếu tôi làm điều này:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

Tôi có thể ghi nhật ký đầu ra của mình bằng hàm LOG nhưng dường như không thể nhận được mã thoát chính xác, tôi giả sử mã tôi nhận được là mã từ phép gán biến.

Tôi muốn tiếp tục sử dụng chức năng LOG của mình để nắm bắt tất cả đầu ra khi nó định dạng và gửi mọi thứ đến một tệp, syslog và màn hình cho tôi.

Làm cách nào tôi có thể nắm bắt kết quả trong một var VÀ lấy mã thoát chính xác từ tập lệnh từ xa?


Câu trả lời:


37

Lý do bạn không nhận được mã lỗi chính xác là vì localthực sự là điều cuối cùng được thực thi. Bạn cần khai báo biến là cục bộ trước khi chạy lệnh.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

Bạn có thể thấy vấn đề ở đây:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

"Địa phương" dường như là vấn đề. Điều này làm việc cho tôi:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

bạn cũng đúng, nhưng jodanm nhanh hơn!
mconlin

Vâng, 26 giây.
Hauke ​​Laging

5
Không phải là một lớp học tiếng Anh nhưng không chính xác để nói 'nhanh hơn'.
mtahmed

5
Tôi biết đó là một trò đùa. Một cái xấu tôi cho là. Trên mạng không ai biết bạn là một con chó.
mconlin

câu trả lời của jordanm cũng giải thích TẠI SAO đây là vấn đề :)
Doktor J

2

Trên thực tế, không có câu trả lời nào ở trên bẫy bẫy thông báo và mã lỗi ssh, có thể được thực hiện như sau (bỏ qua các chức năng tùy chỉnh của tôi):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
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.