Sự cố trong khi chạy lệnh newgrpiến trong tập lệnh


9

Tôi muốn thay đổi nhóm làm việc trong kịch bản của tôi. Vì vậy, tôi đã viết một dòng newgrp test_grp1trong kịch bản của tôi. Nhưng kịch bản của tôi sẽ tự động thoát sau khi chạy dòng này. Có giải pháp nào để khắc phục vấn đề này?

#/bin/ksh
...
newgrp test_grp1
...

Lưu ý: Tôi đang sử dụng hệ điều hành Unix AIX.

Câu trả lời:


10

newgrpbắt đầu một subshell với nhóm bạn đã chỉ định. Vì vậy, dòng đó trong tập lệnh của bạn sẽ không hoàn thành cho đến khi hoàn thành phần con đó.

Việc xử lý newgrpcũng khác nhau nếu bạn đang sử dụng bashhoặc ksh. kshthực hiện nó như là một lệnh tích hợp tương đương với exec /usr/bin/newgrp [group]. Vì vậy, như exec, newgrpkhông bao giờ trở lại. (Xem một số tài liệu ở đây .)

Nếu bạn muốn nó trả về và muốn thực thi các lệnh trong lớp con đó với danh tính nhóm đã thay đổi, bạn có thể sử dụng chuyển hướng.

Ví dụ:

#!/bin/ksh

echo "Before newgrp"
/usr/bin/newgrp users <<EONG
echo "hello from within newgrp"
id
EONG
echo "After newgrp"

Thông báo: /usr/bin/newgrpđược gọi một cách rõ ràng để tránh những tiềm ẩn exectừ ksh. Lệnh cuối cùng trong tập lệnh đó sẽ chạy trong shell gốc, với danh tính nhóm ban đầu.


tình yêu từ tôi, đã tiết kiệm trong ngày bằng cách sử dụngnewgrp docker
toing_toing

chỉ cần lưu ý rằng, không nên thụt lề
EONG

2

Khi một quá trình đã được bắt đầu, nó không thể có được bất kỳ đặc quyền bổ sung nào. Vì vậy, bạn không thể có được tư cách thành viên nhóm ở giữa tập lệnh. Bạn có thể chạy toàn bộ tập lệnh với thành viên nhóm bổ sung:

newgrp test_grp1
/path/to/script

Bạn không thể thay đổi tập lệnh giữa GID thực sự của mình. Nếu bạn thực sự cần điều đó, hãy chuyển sang một ngôn ngữ mà bạn có thể, chẳng hạn như Perl. Tuy nhiên, hiếm khi cần thay đổi GID thực sự của bạn, vì nó không quan trọng lắm. Thông thường, đủ để thực hiện cuộc gọi thỉnh thoảng tới chgrp(tạo tệp không có quyền nhóm trước, sau đó chạy chgrp, sau đó thêm quyền nhóm; nếu bạn tạo tệp có quyền nhóm, có một điều kiện cuộc đua: người dùng trong nhóm đầu tiên có thể mở tập tin trước khi bạn có thời gian để chạy chgrp).


Có bất kỳ lý do nào điều này không thể được thực hiện bằng cách gói nửa sau của tập lệnh vào một khung con?
Caleb

@Caleb Không phải là một subshell nói đúng, nhưng bạn có thể chuyển một tập lệnh đến shell được gọi bằng newgrpđầu vào tiêu chuẩn của nó, như trong câu trả lời của Mat .
Gilles 'SO- ngừng trở nên xấu xa'
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.