Điểm:1

Chạy Bash Script với quyền root với phần tập lệnh không phải root

lá cờ gh

Tôi có một tập lệnh bash cần chạy với quyền root để hoàn thành một nhiệm vụ trong trường hợp này là làm cho trình xác thực chụp nhanh chuỗi khối Helium.

Tôi đã chỉnh sửa tệp /etc/sudoers để cho phép tôi chạy tập lệnh này với quyền root. Điều này hoạt động tốt.

useraccount ALL=(ALL:ALL) NOPASSWD:/home/useraccount/validator_data/snapshotmaker.sh

Lệnh trong kịch bản như sau:

sudo docker exec trình xác thực chụp nhanh công cụ khai thác /var/data/$dtt

sau đó, lệnh tạo một tệp như thế này '30-10-2021T233752.bin'.

Bước tiếp theo của tôi là lấy tệp này và sao chép nó vào IPFS để tôi có thể chia sẻ nó. Lệnh để làm điều này là:

tệp ipfs cp /ipfs/$(ipfs add -Q $localfile) $ip

Hiện tại tôi nhận được lỗi sau:

Lỗi: không tìm thấy repo IPFS trong /root/.ipfs. vui lòng chạy: 'ipfs init'

Điều này là do nó đang cố chạy nó với quyền root khi cấu hình nằm trong tài khoản người dùng của tôi.

Tôi đã cố gắng chuyển đổi tài khoản ở giữa tập lệnh nhưng dường như điều đó đã giết chết nó.

Vì vậy, câu hỏi của tôi là làm thế nào để chạy lệnh IPFS với tư cách là người dùng ban đầu của tôi từ bên trong tập lệnh gốc.

Tập lệnh Bash của tôi:

#!/bin/bash

dt=$(ngày '+%d-%m-%YT%H%M%S');
dtt="${dt}.bin"
a='/var/data/'
c="${a}${dt}.bin"

tiếng vang "${c}"

sudo docker exec trình xác thực chụp nhanh công cụ khai thác /var/data/$dtt


localfile="/home/useraccount/validator_data/${dt}.bin"
tiếng vang "LocalFile: ${localfile}"

ip=" /Helium/Snapshots/2021/${dt}.bin"
tiếng vang "Vị trí IPFS: ${ip}"

ngủ 2

nếu [ -f "$localfile" ]; sau đó
        echo "$localfile tồn tại."
        sudo chown tài khoản người dùng $localfile
        tôi là ai
        su - tài khoản người dùng
        tôi là ai
        tệp ipfs cp /ipfs/$(ipfs add -Q $localfile) $ip
        #ipfs files cp /ipfs/$(ipfs add -Q <local-file>) "/Helium/Snapshots/2021/<dest-name>"
khác 
    tiếng vang "$localfile không tồn tại."
fi

Đầu ra như sau:

/var/data/31-10-2021T005728.bin
Vâng
LocalFile: /home/useraccount/validator_data/31-10-2021T005728.bin
Vị trí IPFS: /Helium/Snapshots/2021/31-10-2021T005728.bin
/home/useraccount/validator_data/31-10-2021T005728.bin tồn tại.
nguồn gốc

Và rồi nó chết. Nếu tôi loại bỏ su thì tôi nhận được vấn đề gốc như đã đề cập ở đầu bài đăng này.

Hy vọng ai đó có thể giúp đỡ.

sudodus avatar
lá cờ jp
Bạn đang chạy tập lệnh này theo cách thủ công hay tự động (ví dụ: qua `cron`)? - Không chạy toàn bộ tập lệnh với quyền root. Thay vào đó hãy chạy nó như người dùng bình thường của bạn. Sau đó, khi nó đến các lệnh cần quyền nâng cao, bạn đã gọi chúng bằng sudo và bạn sẽ được nhắc nhập mật khẩu. Nhưng **bạn có thể tạo 'chỉ' các tác vụ sudo cần thiết có thể chạy mà không cần mật khẩu**: chỉnh sửa `/etc/sudoers` qua `visudo`.
DevilCode avatar
lá cờ gh
Hiện tại tôi đang chạy thủ công nhưng sẽ cron nó sau khi tất cả nội dung hoạt động. Bạn đang nói rằng tôi chỉ nên thêm lệnh sudo docker vào sudoers chứ không phải tập lệnh bash?
bac0n avatar
lá cờ cn
@sudodus Tôi sẽ nói ngược lại. ví dụ: trong trường hợp này, sẽ cấp cho người dùng quyền truy cập vào `chown` giống như tặng chìa khóa. Miễn là tập lệnh có các tác vụ được xác định rõ ràng thì `sudo` sẽ không gây ra vấn đề gì.
bac0n avatar
lá cờ cn
Có một khoảng trống trên `ip=" /Helium..."`
bac0n avatar
lá cờ cn
@DevilCode Tôi khuyên bạn nên xóa tất cả sudo khỏi tập lệnh và chạy tập lệnh với sudo và sử dụng su với ipfs: `su -c 'tệp ipfs cp /ipfs/$(ipfs add -Q $1) $2' _ "$localfile" "$ip"`
sudodus avatar
lá cờ jp
@bac0n, tôi đồng ý rằng bạn không nên cấp quyền truy cập chung cho chown mà chỉ cấp quyền truy cập cho (các) dòng lệnh cụ thể, được tập lệnh sử dụng. Nếu tôi nhớ không lầm, điều này là có thể, và sẽ làm cho nó an toàn. - Mặt khác, với quyền truy cập vào toàn bộ shellscript, bạn cũng nên bẫy ctrl C để giảm nguy cơ bị lạm dụng. Đây cũng sẽ là một giải pháp tốt.
sudodus avatar
lá cờ jp
@DevilCode, Vâng, đó là những gì tôi đã đề xuất, **toàn bộ dòng lệnh** với `sudo docker ...` và `sudo chown useraccount $localfile`
DevilCode avatar
lá cờ gh
Ai đó sẽ phải viết điều này ra vì bây giờ tôi đang lạc lối. @bac0n lệnh đó hoạt động như thế nào? Tôi nghĩ $1 $2 là đối số cho một tập lệnh?
bac0n avatar
lá cờ cn
`su -c` hoạt động giống như `sh -c` trong đó `-c` nhận đối số đầu tiên là 'chuỗi lệnh' và các đối số sau trở thành tham số vị trí trong chuỗi lệnh, ví dụ: `su user -c ' echo $0 $1 $2' _ một hai`.
DevilCode avatar
lá cờ gh
Không hoạt động không may. Tôi đã thử sudo su useraccount -c '/usr/local/bin/ipfs stats repo' không hoạt động dù có hoặc không có sudo. nó là một tập lệnh ổn nhưng khi nó được chạy qua crontab thì nó bị lỗi. crontab phải làm điều gì đó kỳ lạ. Nếu tôi chỉ gọi lệnh trực tiếp từ tập lệnh /usr/local/bin/ipfs stats repo thì điều này hoạt động. Nếu tôi làm điều đó với lệnh tập tin thì không. Không có ý tưởng nào khác ngoài việc nó đang chạy ở một số địa điểm kỳ lạ hoặc một cái gì đó.
Điểm:1
lá cờ jp

Tôi đã thực hiện một bài kiểm tra 'chạy khô' mà không cần người đóng tàu và bất cứ điều gì bạn làm trong đó và không có ipfs. phương pháp Nên làm việc cho bạn với các chương trình thực tế sau một số điều chỉnh.

  • Chạy shellscript kịch bản như người dùng bình thường của bạn, không phải với sudo.

  • Chỉnh sửa tập lệnh để thay đổi từ 'người thử nghiệm' trong bản trình diễn của tôi thành tên người dùng của bạn.

  • Chỉnh sửa chính xác các dòng lệnh cần sudo không có mật khẩu với visudo,

    $ LANG =C đuôi sudo -n2 /etc/sudoers
    %tester ALL=NOPASSWD: /usr/sbin/docker exec ảnh chụp nhanh công cụ khai thác xác thực mất /var/data/tmpfil
    %tester ALL=NOPASSWD: /usr/bin/chown tester /home/tester/validator_data/tmpfil
    
    • Điều quan trọng là phải có một tên cố định của tệp cho các thao tác sudo. Sau đó, nó có thể được đặt một cái tên tùy thuộc vào thời gian.
    • Kiểm tra vị trí của tệp thực thi docker (có thể không có trong /usr/sbin).

kịch bản sửa đổi của tôi kịch bản:

#!/bin/bash

nếu [ "$(whoami)" != "người kiểm tra" ]
sau đó
 echo "chạy dưới dạng 'người kiểm tra'"
 lối ra
fi

dt=$(ngày '+%d-%m-%YT%H%M%S');
dtt="${dt}.bin"
a='/var/data/'
c="${a}${dt}.bin"

tiếng vang "${c}"

Sudo /usr/sbin/docker exec trình xác nhận trình khai thác ảnh chụp nhanh /var/data/tmpfil

nếu [ -f "/home/tester/validator_data/tmpfil" ]; sau đó
        ls -l "/home/tester/validator_data/tmpfil"

        sudo /usr/bin/chown tester "/home/tester/validator_data/tmpfil"
        mv "/home/tester/validator_data/tmpfil" "/home/tester/validator_data/${dt}.bin"
        localfile="/home/tester/validator_data/${dt}.bin"
        tiếng vang "LocalFile: ${localfile}"
        ls -l "${localfile}"

        ip=" /Helium/Snapshots/2021/${dt}.bin"
        tiếng vang "Vị trí IPFS: ${ip}"

        ngủ 2

        echo "$localfile tồn tại."
        tôi là ai
        /usr/local/bin/ipfs files cp /ipfs/$(/usr/local/bin/ipfs add -Q $localfile) $ip
        #ipfs files cp /ipfs/$(ipfs add -Q <local-file>) "/Helium/Snapshots/2021/<dest-name>"
khác 
    tiếng vang "$localfile không tồn tại."
fi

Một kịch bản giả vờ là người đóng tàu dòng lệnh:

#!/bin/bash

nếu [ "$EUID" == "0" ]
sau đó
 tiếng vang "thế giới của docker"> "/home/tester/validator_data/tmpfil"
 chown root:root "/home/tester/validator_data/tmpfil"
 lặp lại "được"
khác
 tiếng vang "chạy với sudo"
fi

Chạy thử:

tester@lenovo-v130:~$ LANG=C ./scrip 
/var/data/01-11-2021T051748.bin
Vâng
-rw-r--r-- 1 gốc root 15 tháng 11 1 05:17 /home/tester/validator_data/tmpfil
LocalFile: /home/tester/validator_data/01-11-2021T051748.bin
-rw-r--r-- 1 người kiểm tra root 15 tháng 11 1 05:17 /home/tester/validator_data/01-11-2021T051748.bin
Vị trí IPFS: /Helium/Snapshots/2021/01-11-2021T051748.bin
/home/tester/validator_data/01-11-2021T051748.bin tồn tại.
kiểm thử
./scrip: dòng 34: ipfs: không tìm thấy lệnh
./scrip: dòng 34: ipfs: không tìm thấy lệnh
DevilCode avatar
lá cờ gh
Ok vì vậy tôi đã thay đổi nó để chạy như bạn đã đề xuất. Khi được gọi thông qua dòng lệnh, nó hoạt động hoàn hảo. Khi được gọi qua crontab, mọi thứ đều hoạt động ngoại trừ dòng cp của tệp ipfs. Đối với một số cộng hưởng khi ipfs được gọi, dòng đó sẽ không chạy khi được thực hiện qua crontab. Tôi thậm chí đã thêm đường dẫn đầy đủ /usr/local/bin/ipfs và không gặp may.
DevilCode avatar
lá cờ gh
Đã tìm thấy: /usr/local/bin/ipfs files cp /ipfs/$(/usr/local/bin/ipfs add -Q
DevilCode avatar
lá cờ gh
Cảm ơn mọi người !!
sudodus avatar
lá cờ jp
@DevilCode, Bạn đã làm cho nó hoạt động :-) Tôi rất vui vì tôi có thể giúp bạn trong suốt quá trình.
Điểm:0
lá cờ cn

Trước tiên, bạn cần tạo cấu hình sudo cho tập lệnh của mình, trong ví dụ này, chúng tôi đặt nó trong /etc/sudoers.d với sự cho phép 440:

Cmnd_Alias ​​CMDS = /opt/bin/docker_example.sh
User_Alias ​​CMDUSERS = bac0n
CMDUSERS TẤT CẢ=(TẤT CẢ) NOPASSWD: CMDS
Mặc định!CMDS !requiretty

Chúng tôi đặt tên cho kịch bản docker_example.sh, như được hiển thị trong ví dụ Sudo:

#!/bin/bash

# Thoát ngay lập tức ở trạng thái thoát khác không.
đặt -e

((EUID != 0)) && {
    echo Tập lệnh này sẽ chạy với quyền root.
    thoát 1
}

[[ ${SUDO_USER+ } ]] && \
user_account=$SUDO_USER || user_account=$(id -nu)

printf -v bin_file \
'%(%d-%m-%YT%H%M%S)T.%s' -1 thùng

local_file=$HOME/validator_data/$bin_file
 ipfs_file=/Helium/Snapshots/2021/$bin_file

inf'
Tệp Thùng: %s
Tập tin có sẵn
Tệp IPFS: %s
' "$bin_file" "$local_file" "$ipfs_file"

ảnh chụp nhanh công cụ khai thác trình xác thực docker exec lấy "/var/data/$bin_file"
ngủ 2

[[ -f $local_file ]] || {
    echo Tập tin không tồn tại: "$local_file"
    thoát 1
}

chown $user_account "$local_file"

#
# su $user_account -c 'echo whoami: $1, su: $(id -nu)' _ $(id -nu)
#
su $user_account -c 'ipfs files cp "/ipfs/$(ipfs add -Q "$1")" "$2"' _ "$local_file" "$ipfs_file"

Bây giờ bạn sẽ có thể thêm tập lệnh này với sudo vào crontab và tập lệnh này sẽ chạy với NOPASSWD.

$ sudo crontab -u bac0n -e
# lệnh tối thiểu giờ dom tháng dow
* * * * * sudo /opt/bin/docker_example.sh > /dev/null 2>&1
Điểm:0
lá cờ cn

Vì vậy, câu hỏi của tôi là làm thế nào để chạy lệnh IPFS với tư cách là người dùng ban đầu của tôi từ bên trong tập lệnh gốc.

sudo su - tài khoản người dùng -c LỆNH

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.