2012-01-24 15 views
11

Tôi chỉ cần ssh-ed đến một số máy chủ từ xa và thấy rằng stdoutstderr của tất cả các lệnh/quy trình mà tôi đang cố gắng chạy trong bash được chuyển đến một nơi nào đó. câu hỏi Vì vậy, tôi đã sauLàm thế nào để định tuyến lại stdout, stderr trở lại/dev/tty

Làm thế nào để phát hiện:

1) Những tập tin stdout, stderr được beeing định tuyến lại trong Linux?

2) Và làm thế nào định tuyến lại theo mặc định stdoutstderr trở về/dev/tty?

Cảm ơn bạn trước.

+0

Bạn thấy điều đó như thế nào? –

+0

chỉ cần gõ lệnh sẽ xuất ra STDOUT và STDERR. – Sergey

+0

Có điều gì có liên quan trong .bashrc không? –

Trả lời

10

Một lệnh rằng nên làm theo nghĩa đen những gì bạn yêu cầu trong (2) là

exec >/dev/tty 2>&1 

Nhưng tôi nghi ngờ rằng phân tích của bạn của vấn đề là không chính xác. Sẽ hữu ích khi xem kết quả của ssh -v ... (trong đó ... là bất kỳ đối số nào bạn đã nhập trong lệnh ssh gốc).

+0

thêm điều này vào vòng lặp quản lý ngã ba của tôi đã làm các mẹo để thiết lập lại stdout. Tôi đã sshing, chạy màn hình, và chạy một kịch bản perl os vá forking, bên trong đó newlines bắt đầu hành động như vận chuyển bỏ qua đến dòng tiếp theo mà không trở về. Mucho gracias để chỉ ra lệnh này. –

1

Nó chỉ có thể được thực hiện nếu vỏ khao khát của bạn được bắt đầu với một đường ống để tee lệnh với bàn điều khiển khác làm tham số.

Hãy để tôi giải thích.

Nếu bạn đang đăng nhập /dev/tty1 và người khác đang đăng nhập /dev/tty2. Nếu bạn bắt đầu trình bao (bash) của bạn bằng cách làm theo lệnh tất cả STDOUT/STDERR sẽ được định tuyến lại/sao chép vào một vỏ khác (/dev/tty2 trong trường hợp này).

bash 2>&1 | tee /dev/tty2 

Vì vậy, ai đó đang ngồi trong /dev/tty2 sẽ thấy tất cả hoạt động của bạn.

Nếu ai đó đăng nhập shell là /bin/bash 2>&1 | tee /dev/tty2 thay vì /bin/bash Nó sẽ xảy ra mỗi lần đăng nhập. Nhưng tôi không chắc chắn rằng trình đăng nhập có thể được đặt theo cách đó.

Nếu ai đó định tuyến lại tất cả đầu ra của vỏ của bạn theo cách này, bạn có thể kiểm tra nó chỉ bằng cách kiểm tra xem có bất kỳ tee nào đang chạy ở chế độ nền hay không.

ps ax | grep tee 

này một cái gì đó sẽ ra như

tee /dev/tty2 
8

Lệnh:

ls -l /proc/$$/fd/{1,2} 

sẽ cho bạn thấy những file được mở như (bộ mô tả tập tin 1) stdout và stderr (file descriptor 2) .

+0

rất tốt! bất kỳ ý tưởng làm thế nào để liên quan ex .: '1 -> ống: [16418291]' để một pid? –

+0

Tôi chỉ tìm thấy, tại/proc, pid khác với điều này! '0 -> ống: [16418291]' –

1

Câu trả lời cho câu hỏi đầu tiên của bạn có thể được tìm thấy trong /proc/self/fd. Nó chứa các liên kết đến các tập tin (hoặc những thứ khác, đường ống, ổ cắm, vv) mà thể hiện bash của bạn được kết nối với.

[email protected]:~# ls -l /proc/self/fd 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15529/fd/ 
[email protected]:~# ls -l /proc/self/fd < /dev/null 
total 0 
lr-x------ 1 root root 64 May 21 02:18 0 -> /dev/null 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15536/fd/ 
[email protected]:~# ls -l /proc/self/fd | cat 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
l-wx------ 1 root root 64 May 21 02:18 1 -> pipe:[497711] 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15537/fd/ 
[email protected]:~# 

Trong ví dụ đầu tiên, bạn sẽ nhìn thấy 3 file descriptor đầu tiên (đó là những tiêu chuẩn đầu ra, đầu vào, và không bị lỗi, tương ứng) tất cả các điểm đến pseudo-terminal /dev/pts/3 tôi. Trong ví dụ thứ hai, tôi đã chuyển hướng đầu vào đến /dev/null, vì vậy các điểm mô tả tệp đầu vào tiêu chuẩn là /dev/null. Và trong ví dụ cuối cùng tôi đã gửi đầu ra của ls đến cat thông qua một đường ống và bộ mô tả tệp đầu vào tiêu chuẩn phản ánh điều này. Theo như tôi biết không có cách nào để tìm quá trình nào có đầu kia của đường ống. Trong tất cả các ví dụ có bộ mô tả tập tin thứ tư đại diện cho xử lý mà ls có để đọc /proc/self/fd. Trong trường hợp này, nó nói /proc/15537/proc/self thực ra là một liên kết tượng trưng đến /proc/pid trong đó pid là PID của quá trình truy cập /proc/self.