Sự khác biệt giữa a.out và ./a.out


9

Sự nhầm lẫn của tôi

a.outlà đầu ra của các chương trình mà tôi thực thi trong Ubuntu 12.10 của mình. Trong hệ thống Red Hat khi tôi thực thi a.outtrong thiết bị đầu cuối, nó thực thi. Trong khi ở Ubuntu tôi phải thực thi ./a.outđể có được đầu ra. 'a.out' không hoạt động.

Ai đó có thể giải thích sự khác biệt giữa các lệnh là gì?


2
+1 Không chắc chắn tại sao câu hỏi hợp lệ này đã bị bỏ phiếu.
HeatfanJohn

4
Chờ đã, redhat bao gồm ./trong $PATHmặc định? Ewwwwww ...
Shadur

Câu trả lời:


17

Hành vi bạn trải nghiệm rất có thể phụ thuộc vào sự khác biệt trong biến môi trường $PATH. Về $PATHcơ bản, nó là một danh sách các thư mục được phân tách bằng dấu hai chấm, được tìm kiếm để thực thi cụ thể khi một chương trình được gọi bằng cách sử dụng execlệnh gọi hệ điều hành. Có $PATHthể chứa các thành phần đường dẫn tương đối, thông thường .hoặc một chuỗi rỗng, cả hai đều đề cập đến thư mục làm việc hiện tại. Nếu thư mục hiện tại là một phần của $PATH, các tệp trong thư mục làm việc hiện tại có thể được thực thi chỉ bằng tên của chúng, vd a.out. Nếu thư mục hiện tại không có $PATH, người ta phải chỉ định một đường dẫn tương đối hoặc tuyệt đối để thực thi, ví dụ ./a.out.

Có các thành phần đường dẫn tương đối trong $PATHcó ý nghĩa bảo mật tiềm năng như các tệp thực thi trong các thư mục trước đó trong $PATHcác tệp thực thi bị lu mờ trong các thư mục sau này trong danh sách. Hãy xem xét ví dụ một cuộc tấn công trên một hệ thống nơi mà các đường dẫn thư mục làm việc hiện tại .preceeds /bintrong $PATH. Ví dụ ls, nếu kẻ tấn công quản lý để đặt một tập lệnh độc hại chia sẻ tên với một tiện ích hệ thống thường được sử dụng , trong thư mục hiện tại (thường dễ thay thế nhị phân trong sở hữu gốc /bin), người dùng sẽ vô tình gọi tập lệnh độc hại khi ý định là để gọi hệ thống ls. Ngay cả khi .chỉ được nối vào cuối$PATH, một người dùng có thể bị lừa để vô tình gọi một tệp thực thi trong thư mục hiện tại có chung tên với một tiện ích chung không tìm thấy trên hệ thống cụ thể đó. Đây là lý do tại sao thông thường không có các thành phần đường dẫn tương đối như là một phần của mặc định $PATH.


Xin chào .. Tôi đang cố gắng thực hiện a.out trong Unbfox 12.10 từ cùng một tệp mà nó được lưu trữ. Nhưng nó vẫn không hoạt động. Tôi phải sử dụng ./a.out không giống như trong redhat.
Munai Das Udasin

Nếu bạn làm echo $PATHtrên mỗi hệ thống, bạn sẽ thấy .là một phần của PATHRed Hat, nhưng không phải trên hệ thống Ubuntu. Nếu bạn muốn các hành vi tương tự trên Ubuntu bạn có thể thêm .vào PATHtrên Ubuntu bằng lệnh export PATH=$PATH:.(thêm PATH=$PATH:.vào ~/.profileđể thực hiện thay đổi vĩnh viễn), nhưng lưu ý rằng điều này có ý nghĩa bảo mật nhất định mà tôi cố gắng giải thích trong câu trả lời đã chỉnh sửa.
Thomas Nyman

1
1 cho các cảnh báo bảo mật của việc có ./trong $PATH. Đó là một ý tưởng tồi từ quan điểm bảo mật và nó khuyến khích hành vi cẩu thả mà bạn thực sự không cần.
Shadur

hi thomas .... echo $PATHtrong chiếc mũ đỏ không có .tên cuối đường dẫn như bạn echo $PATHđã nói đã cho tôi cái này trong thực tế /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin::/opt/oracle/product/11.2.0/clien t_1/bin:/home/H11/u756938/binvà a.out vẫn hoạt động ...
Munai Das Udasin

1
Cả hai .và một chuỗi trống trong $PATHtham chiếu đến thư mục hiện tại. Lưu ý ::sau /usr/bintrong đầu ra của echo $PATH.
Thomas Nyman
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.