Có thể trên Linux cho một quá trình để viết bên trong một ổ cắm được mở bởi một cái khác?
Giả sử tôi mở kết nối với google.com bằng netcat:
myuser@linux:~$ nc google.com 80
Bây giờ tôi có thể tra cứu quá trình pid và mở thư mục mô tả tập tin của nó:
myuser@linux:~$ ls -la /proc/24105/fd
totale 0
dr-x------ 2 myuser myuser 0 2012-03-10 19:01 .
dr-xr-xr-x 7 myuser myuser 0 2012-03-10 19:01 ..
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 0 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 1 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:01 2 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 3 -> socket:[3947162]
Vì vậy, bây giờ tôi muốn thực hiện yêu cầu HTTP bằng cách sử dụng tiếng vang bên trong ổ cắm đó:
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/3
bash: /proc/24285/fd/3: no such device or address
Làm điều đó như root không thay đổi kết quả.
Tôi không thể viết bên trong ổ cắm nhưng tôi có thể viết bên trong stdin:
myuser@linux:~$ echo "GET / HTTP/1.1" >> /proc/24285/fd/0
myuser@linux:~$
Nhưng đó không phải là điều tôi muốn làm.
Tôi đã suy nghĩ: một ổ cắm Linux nên được coi như một tập tin, phải không? Một hoặc nhiều quy trình có thể sử dụng cùng một ổ cắm, vậy tại sao tôi không thể làm điều này?
gdb -p 24285
và sau đó tôi có thể viết bên trong bộ mô tả tệp bằng cách sử dụng call write(3, "test",4)
. Nó hoạt động, nhưng tôi muốn làm điều tương tự từ Procfile vì việc sử dụng gdb yêu cầu dừng quá trình (vì vậy làm tăng nguy cơ gặp sự cố hoặc những điều xấu khác)
nc
có thể làm điều này, nhưng cố gắng làm như vậy sẽ dẫn đến "Điểm cuối vận chuyển không được kết nối". Lệnh ví dụnc -v --send-only -U /proc/123/fd/3 <<< 'GET /'$'\n\n'