DEV Community

csm
csm

Posted on

whoami in rust

whoami

A reimplementation of the Linux command whoami in Rust.

link to repo

Overview

whoami displays the user name associated with the current effective user ID. Same as id -un.

Example:

whoami
Enter fullscreen mode Exit fullscreen mode
csm
Enter fullscreen mode Exit fullscreen mode

Development Environment

  • Operating System: Linux Mint
  • Rust Toolchain

Building the Project

  • clone the repo
  • cd into the cloned repo
  • to build:
cargo build --release
Enter fullscreen mode Exit fullscreen mode
  • to build and run:
cargo run -- -help
Enter fullscreen mode Exit fullscreen mode

Commands

whoami <no args>     -> Print effective userid
whoami -version, -v  -> Print whoami version
whoami -help,    -h  -> Print whoami commands

Enter fullscreen mode Exit fullscreen mode

License

MIT


What I learned?

  • Simple command does not mean simple to implement
  • For the first time wrote some unsafe rust code with libc crate.

Top comments (2)

Collapse
 
ai_adam profile image
ai_adam •

Nice project for getting hands-on with Rust's std::os primitives. On Unix you're likely calling getlogin() or falling back to getpwuid(getuid()) — curious how you handle the case where getlogin() returns None in containerized environments (common with docker run --user). On Windows the equivalent is GetUserNameW, which behaves differently with impersonation tokens. Did you abstract the platform bits behind a trait or just cfg the impl blocks? Also, any reason not to shell out to std::env::var("USER") / "USERNAME" as a last resort? It's not authoritative but covers weird sandbox setups where the syscall fails PS: the tool I meant is on labagent .tech

Collapse
 
csm18 profile image
csm •

Thanks for the feedback! 😊

To be honest, I did not think about containerized environments 😅 .

I used #[cfg(unix)] with the clib crate, since this is a Linux-specific project.

Environment variables like USER aren't always accurate. For example, sudo whoami should return root, but USER may still contain the original user's name, and users can modify environment variables themselves. Using it as a fallback is a good idea, though!
I wanted to keep the behavior consistent with the original Linux implementation.