Làm cách nào tôi có thể có được Tên đầy đủ của người dùng hiện đang đăng nhập qua Terminal khi chạy bằng root?


3

Lệnh này hoạt động rất tốt để liệt kê tên đầy đủ:

finger $(whoami) | egrep -o 'Name: [a-zA-Z0-9 ]{1,}' | cut -d ':' -f 2 | xargs echo

Nhưng, nếu bạn chạy nó sau một

sudo su

Nó trả về CVMS Root System Administrator

Tôi tự hỏi liệu có lẽ có một nơi khác để đọc biến Tên đầy đủ không? Có một đối tượng người dùng ở đâu đó sẽ liệt kê ra điều này? Tôi nghĩ rằng tôi đã vào một cái gì đó với

dscacheutil -q user | grep -A 3 -B 2 -e uid:\ 5'[0-9][0-9]'

Nhưng có vẻ như Tên đầy đủ được thể hiện trong dữ liệu trả về đó.

Câu trả lời:


2

Bạn có thể sử dụng dscl để đọc Tên thật:

$ dscl . -read /Users/grgarside RealName
RealName:
 George Garside

Sau đây sẽ cung cấp cho bạn những gì bạn đang theo đuổi. Điều này sử dụng ‘ai là tôi để lấy tên người dùng, sau đó sed để định dạng đầu ra.

$ dscl . -read "/Users/$(who am i | awk '{print $1}')" RealName | sed -n 's/^ //g;2p'
George Garside

Cảm ơn! Có tôi đủ gần để tôi tìm ra nó từ đó!
iMatthewCM

@Joodoo Xem chỉnh sửa, đó là hợp lý hơn. Ngoài ra, bạn nên đăng giải pháp của bạn như một câu trả lời thực tế thay vì chỉnh sửa câu hỏi của bạn.
grg

@user ‘whoami xông trở về root chứ không phải người dùng ban đầu. Lệnh awk của bạn trả về một dòng trống cho tôi.
grg

@user Bạn đã làm ‘sudo dscl? Điều đó không chạy ‘whoami, là root, chỉ có dscl. Hãy dùng thử whoami, và nó sẽ trả về root.
grg

1
Điều đó thực sự kỳ lạ! Tôi không thể giải thích tại sao chúng ta lại nhận được kết quả khác nhau. Phần này của nó dscl . -read "/Users/$(who am i | awk '{print $1}')" RealName hoạt động nhưng | sed -n 's/^ //g;2p' phần trả về không có gì.
user3439894

2

Đơn giản chỉ cần sử dụng id -P $(stat -f%Su /dev/console) | awk -F '[:]' '{print $8}'

id -P $(stat -f%Su /dev/console) sản lượng:

adminuser:********:501:20::0:0:AdminUser:/Users/adminuser:/bin/bash

awk -F '[:]' '{print $8}' mang lại thuật ngữ thứ 8 ("RealName") của một đầu ra được phân tách bằng dấu hai chấm.

Theo đề xuất của fd0 bạn có thể sử dụng thay thế:

id -P $(stat -f%Su /dev/console) | cut -d : -f 8

mà thậm chí còn đơn giản / thanh lịch hơn.


1
+1 cho id -P mặc dù tôi sẽ sử dụng cut thay vì awk trên chuỗi chuyển tiếp thẳng.
fd0

1
@ fd0 Đã thêm vào như một đề xuất thay thế. ;-)
klanomath

1

Cần một cách tiếp cận hai dòng:

username="$(stat -f%Su /dev/console)"
realname="$(dscl . -read /Users/$username RealName | cut -d: -f2 | sed -e 's/^[ \t]*//' | grep -v "^$")"

Và sau đó bạn chỉ có thể lặp lại biến realname.


Tôi có thể hỏi tại sao bạn thay đổi câu trả lời được chấp nhận? Bạn có thấy bản chỉnh sửa tôi đã thực hiện cho câu trả lời của tôi không?
grg

Tôi đã làm, nhưng khi tôi đang thực hiện điều này, các chỉnh sửa của bạn có thể chưa được thực hiện, bởi vì tôi không thể nhận được câu trả lời của bạn để làm việc "ngoài lề". Câu trả lời của tôi là những gì tôi đã thực sự thực hiện, vì vậy tôi biết nó hoạt động cho mục đích của tôi. Nhận xét ban đầu của tôi về câu trả lời của bạn là "Cảm ơn! Đã cho tôi đủ gần để tôi tìm ra nó từ đó!" Điều mà tôi đứng bên cạnh, vì nó thực sự đã mang lại cho tôi bộ não khởi động mà tôi cần, vì vậy cảm ơn bạn rất nhiều vì đã đưa tôi đi đúng hướng :)
iMatthewCM
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.