2016-04-29 17 views
13

Tôi đang phát triển môi trường trình docker cho mục đích giảng dạy và cần có khả năng chuyển đổi người dùng bên trong docker.lệnh 'su' trong thanh Docker trả về 'phải được chạy từ thiết bị đầu cuối'

Tôi thiết lập người dùng 'người dùng' bằng mật khẩu nhưng khi tôi cố gắng chuyển sang bằng su, tôi nhận được "su phải được chạy từ thiết bị đầu cuối".

Tôi nhận được điều này nếu tôi cố gắng ssh vào docker và cũng bằng cách phát hành lệnh thông qua một vỏ php (một dịch vụ apache đang chạy trên ví dụ Docker).

Bất kỳ trợ giúp nào được đánh giá cao.

+1

Tôi muốn biết thêm về trường hợp/thiết lập sử dụng của bạn. Chạy SSH trong vùng chứa là một mẫu chống. Bạn có cần phải thay đổi người dùng khi đang di chuyển (trong khi bạn đang ở trong thùng chứa không?) Hoặc là một phần của quá trình xây dựng (bằng cách sử dụng một Dockerfile?). – johnharris85

+1

Nếu bạn Google thông báo lỗi này, có một số giải pháp. –

+0

Cảm ơn bạn sự trợ giúp thực sự tràn ngập sẽ được đánh giá cao. Tôi đã tìm thấy một workaround chạy python nhưng sẽ cần một giải pháp phù hợp. – SaintHUN

Trả lời

24

Khi bạn đang ssh-ing vào hoặc đi qua php phiên của bạn không được phân bổ một pty. Tôi đã sử dụng mỗi người trong số các giải pháp sau:

ĐÁP 1: sử dụng ssh -t hoặc ssh -tT để pty phân bổ khi đăng nhập bằng ssh:

tôi đã rất vui vẻ nhận lệnh để chạy ngay do để ptys khi chạy phiên như thế này: jenkins shell -> ssh driver -> ssh test -> docker exec. Câu trả lời hay tại đây: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Hãy thử tùy chọn -t để ssh. Nếu điều đó không hoạt động, hãy thử -tt".

"-t Phân bổ giả-tty.Điều này có thể được sử dụng để thực hiện các chương trình dựa trên màn hình tùy ý trên máy từ xa, có thể rất hữu ích, ví dụ: khi thực hiện các dịch vụ menu. nếu ssh không có tty cục bộ. "

ĐÁP 2: sử dụng Docker chạy -t ... và Docker exec -Nó

Sử dụng -t và các tùy chọn -nó phân bổ pty trong phiên Docker exec của bạn.

Cũng với docker exec, bạn có thể chỉ cần sử dụng tùy chọn -u để đăng nhập vào vùng chứa với tư cách người dùng khác nhau và tránh sử dụng su. ví dụ.

$ docker exec -u root -it small_hypatia bash 

Có một câu hỏi và câu trả lời về vấn đề này ở đây: https://github.com/docker/docker/issues/8631

ĐÁP 3: sử dụng python để đẻ trứng một pty trong shell của bạn

Khá một hack dễ thương :)

[email protected]:~$ su - 
su: must be run from a terminal 

$ echo "import pty; pty.spawn('/bin/bash')" > /tmp/asdf.py 
$ python /tmp/asdf.py 

$ su - 
Password: 

[email protected]:~# 
+2

Trả lời 2 làm việc hoàn hảo cho tôi. Cảm ơn bạn. –

+1

Tôi đang tìm câu trả lời 2 (môi trường docker) - hoạt động! – Pixelartist

+0

Bên trong một thùng chứa chỉ có 3 công trình cho tôi – 4xy

4

Giải pháp này hoạt động bằng cách sử dụng lệnh 'tập lệnh' từ gói 'bsdutiles' thiết lập một pty (thiết bị đầu cuối). Lệnh 'sleep' ở đó để ngăn chặn việc gửi mật khẩu trước khi lệnh 'su' sẵn sàng để đọc nó. Lệnh 'đuôi' xóa dòng nhập "Mật khẩu:" do 'su' phát hành.

sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2 

Hãy coi chừng rootpassword có thể thấy bằng nhiều cách (lịch sử, ps,/proc /, v.v ...). Bắt đầu lệnh với một khoảng trống để ít nhất là tránh ghi lại lịch sử.

0

Nếu bạn sử dụng su-exec thay vì su vấn đề wi tty tty hoàn toàn biến mất vì nó gọi execvp trực tiếp thay vì forking như su nào.

Gosu là một giải pháp thay thế tương tự.

Các vấn đề liên quan