- Linux Run Command As Another User
- 1. Using Linux runuser command as another user
- The runuser command options
- 2. Run a Linux command with substitute user and group ID using ‘su command’
- How to run a command as a specific user in an init script?
- 6 Answers 6
- Run a shell script as another user that has no password
- 8 Answers 8
- How to run systemd service as specific user and group in Linux
- Step 1: Overview on systemd
- Step 2: Create user and Group
- Step 3: Create Sample Script
- Step 4: Create unit file to run systemd service as specific user and group
- Step 5: Verify the systemd unit file configuration
- Related Posts
- 19 thoughts on “How to run systemd service as specific user and group in Linux”
Linux Run Command As Another User
Dear nixCraft,
I just want to know how to run Linux commands as another user or as the root user?
–Sincerely,
Confused About Linux commands.
Dear Confused,
You can use the following commands to run as another user or as root user on Linux.
1. Using Linux runuser command as another user
Only session PAM hooks are run, and there is no password prompt. If run as a non-root user without privilege to set user ID, the command will fail as the binary is not setuid. As runuser doesn’t run auth and account PAM hooks, it runs with lower overhead than su.
For example, as a root user you may want to check shell resource limits for oracle user, enter:
# runuser -l oracle -c ‘ulimit -SHa’
Check nginx or lighttpd web server limitations:
# runuser -l nginx -c ‘ulimit -SHa’
# runuser -l lighttpd -c ‘ulimit -SHa’
Sometime, a root user can not browse NFS mounted share due to permission (security) issue:
# ls -l /nfs/wwwroot/cyberciti.biz/http
OR
# cd /nfs/wwwroot/cyberciti.biz/http
Sample outputs:
However, apache user is allowed to browse or access nfs based system mouted at /nfs/wwwroot/cyberciti.biz/http/:
# runuser -l apache -c ‘ls -l /nfs/wwwroot/cyberciti.biz/http/’
# runuser -l apache -c ‘cd /nfs/wwwroot/cyberciti.biz/http/; vi index.php’
No password is required to use runuser command and it must be run by root user only. Sometimes sudo or su will give following error:
To get around this try the following syntax:
# runuser -u www-data — command
## Run commands as www-data user ##
# runuser -u www-data — composer update —no-dev
# runuser -u www-data — php7 /app/maintenance/update.php
The runuser command options
- -l user_login_name : Make the shell a login shell, uses runuser-l PAM file instead of default one.
- -g group : Specify the primary group.
- -G group : Specify a supplemental group.
- -c COMMAND : Pass a single COMMAND to the shell with -c.
- —session-command=COMMAND : Pass a single COMMAND to the shell with -c and do not create a new session.
- -m : Do not reset environment variables.
- -u username : Run command as given username to get around ‘su -‘ or ‘sudo’ limit.
2. Run a Linux command with substitute user and group ID using ‘su command’
The su command allows you to become a super user or substitute user, spoof user, set user or switch user. It allows a Linux user to change the current user account associated with the running console or shell provided that you know the target user’s password. The syntax is as follows:
Источник
How to run a command as a specific user in an init script?
I’m writing an init script which is supposed to execute a single command as a user different than root. This is how I’m doing it currently:
sudo -u username command
This generally works as expected on Ubuntu/Debian, but on RHEL the script which is executed as the command hangs.
Is there another way to run the command as another user?
(Note that I can’t use lsb init functions as they’re not available on RHEL/Centos 5.x.)
6 Answers 6
On RHEL systems, the /etc/rc.d/init.d/functions script is intended to provide similar to what you want. If you source that at the top of your init script, all of it’s functions become available.
The specific function provided to help with this is daemon . If you are intending to use it to start a daemon-like program, a simple usage would be:
If that is too heavy-handed for what you need, there is runuser (see man runuser for full info; some versions may need -u prior to the username):
For systemd style init scripts it’s really easy. You just add a User= in the [Service] section.
Here is an init script I use for qbittorrent-nox on CentOS 7:
If you have start-stop-daemon
Instead of sudo, try
In my experience, sudo is not always available on RHEL systems, but su is, because su is part of the coreutils package whereas sudo is in the sudo package.
I usually do it the way that you are doing it (i.e. sudo -u username command). But, there is also the ‘djb’ way to run a daemon with privileges of another user. See: http://thedjbway.b0llix.net/daemontools/uidgid.html
Adding this answer as I had to lookup multiple places to achieve my use case. I had a script that runs on startup. This script runs process as a specific (passwordless) user and is running on multiple linux flavors. Here are options on different flavors: (I have taken java as target process for example)
1. RHEL / CentOS 6:
2. RHEL 7 / SUSE12 / other linux flavors where systemd is used:
In your systemd unit file add:
3. Suse 11:
/sbin/startproc -u myUser $JAVA_HOME/bin/java
Источник
Run a shell script as another user that has no password
I would like to run a script from the main ubuntu shell as a different user that has no password.
I have full sudo privileges, so I tried this:
Then I have to enter my password, but I am not sure if that script is now really running under that user.
How can I confirm that the script is really running under that user now?
8 Answers 8
You can do that with su or sudo , no need for both.
The relevant parts of man sudo :
su can only switch user without providing a password if you are root. See Caleb’s answer
You can modify the /etc/pam.d/su file to allow su without password. See this answer.
If you modified your auth file to the following, any user that was part of group somegroup could su to otheruser without a password.
Then test from terminal
If you want to use su instead of sudo, I believe you can use something like this:
- — will simulate a login of the specified user
- -c tells it that you want to run a command
ps. Unfortunately I’m not able to install ruby using rvm with this method, but that’s probably not related.
The answers above are really useful to me but to answer the actual question.
How can I affirm that the script is really running under that user now?-
The output should include your script and the actual user executing it. People on BSD-like systems, e.g. MAC can find similar information with:
Make sure you switch to root user with command sudo su and then use the command
For example: su www-data -s bin/magento cache:clean
I had the same problem. Just type in the command screen -dmS testscreen this will create a detached screen on your non-sudo user account and then you can log it and check if this screen is there by screen -ls .
You can use sudo to do this. First, you need to modify the /etc/sudoers file to add a rule that allows the hudson user to become the other user for the script in question. Let’s assume you have a user1 account that needs to run /usr/local/bin/my_script.sh .
Run visudo to modify the sudoers file. Then, use the following sudo command to run the script from hudson.
It’s very important that you use visudo to modify the sudoers file in order to check the file for errors before putting it in place. Also, I’d suggest a quick read through man sudoers in order to clearly understand what the above does before adding it to your configuration.
Источник
How to run systemd service as specific user and group in Linux
Table of Contents
By default most of the systemd services are configured to run by root user but there is also an option to create a custom systemd service unit file and run it as a speciic user or group or both. So in this article we will check and verify the steps to run systemd service as specific user and group using CentOS/RHEL 7/8 Linux environment.
I have installed Oracle VirtualBox on a Linux server, where I will use a Virtual Machine with RHEL/CentOS 7/8 to verify the steps from this article.
Some more articles on similar topic:
Step 1: Overview on systemd
I hope you are already familiar with below topics
Step 2: Create user and Group
Now this is an optional steps assuming you already have your user and group ready for next steps. But if you do not then you can follow this article to create a new user and assign a custom group (primary or secondary) to the respective user.
Here I have already created a user deepak who is part of deepak and admin group
To verify the groups of any user
So we wish to create a systemd service unit file and run systemd service as specific user and group which for us will be deepak user part of admin group
Step 3: Create Sample Script
We will use our startup script from old articles with some tweaks to check and run systemd service as specific user and group in Linux
So in this script we have added an explicit check for user, so unless the user executing the script is » deepak «, the script will fail to execute. If successful the script will continue to write in /tmp/file for 3 minutes with 1 minute interval. This will also help us make sure that the script does not exits before completing it’s defined task
Change the ownership of the script file to deepak
Provide executable permission to the script
We will execute the script manually to make sure it works as expected
Step 4: Create unit file to run systemd service as specific user and group
Now as highlighted under step 1, I have already written another article with the steps to create a new systemd unit file. Here we will name our systemd unit file as run-as-user.service under /etc/systemd/system . Below is the content of run-as-user.service
Here we have defined User=deepak and Group=admin to make sure the script will be executed only as user deepak which is part of admin group.
You can also use many other directives if required in your environment such as WorkingDirectory , EnvironmentFile etc. For more information check man page of systemd.exec
Refresh the systemd configuration files
Next enable the service (if required) to start automatically at boot
Step 5: Verify the systemd unit file configuration
Now since we are done with the setting up of systemd. Let us verify our configuration. Before starting I have cleared the content of /tmp/file which is where our script /tmp/startup_script.sh will place dummy content every minutes for 3 minutes.
We will only start the run-as-user.service runtime as a reboot is not required to validate the configuration here:
Next check the status of the service
Well looks like everything was good as we were able to run systemd service as specific user and group, you can check the ps status to make sure our script is running using below command:
Now you can monitor the content of /tmp/file for couple of minutes as configured in the script
Lastly I hope the steps from the article to run systemd service as specific user and group in CentOS/RHEL 7/8 Linux was helpful. So, let me know your suggestions and feedback using the comment section.
Related Searches: run service as user linux. systemd allow user to start service. systemd start service as user on boot. linux systemd service run as root. Restarting systemd service only as a specific user? systemd services fail with User= in service file. Start process as a specific user. how to run a service a non-root user completely?
Related Posts
Didn’t find what you were looking for? Perform a quick search across GoLinuxCloud
If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.
For any other feedbacks or questions you can either use the comments section or contact me form.
Thank You for your support!!
19 thoughts on “How to run systemd service as specific user and group in Linux”
what is the “admin” group? I have a “root” group, but not an admin group.
admin group used here is an example
Shouldn’t systemd’s “–user” feature be used to allow non-root accounts run their own services — without bothering the root-wielding admin every time they want to change something?
I’d love an actual example of that…
Any application level service is executed by normal user such as apache
Man you really helped me thanks a lot dude!
Loved! Very well explained!
This is really helpful, thank you. It is also rather timely as I’m trying to get a service to work with a little twist and maybe you have some insight to this.
I’m running VirtualBox with a Ubuntu 20.04 guest and a Windows 10 host. The VM is defined with a shared folder on the host.
I need to run the service as my user and it has to create some files and directories in the shared folder.
There are some really weird things happening.
– I am unable to write anything to the shared folder when I run the script as a service. I always get “Permission Denied” errors.
No problem if I run the service as “sudo service xxx start”, only when it is started on system init. I specifically have an
“After=.mount” in the Init section.
– If I run using “+” before the script name on ExecStart, it runs as root and creates files, but then they just disappear. Actually,
they show up only in the script (e.g. if I issue an “ls” command) but by the time I get to log in, they are gone.
Anyway, I’m tearing what little hair I have out on this and can’t get anywhere. Any insight would be greatly appreciated.
Sorry, I didn’t realize I couldn’t use angle brackets. My “After=.mount” should have been “After=shared-folder-dir.mount”, copied from the systemctl list-units list.
Hi Alan,
If there is a requirement for a certain file system then instead of After= you should use RequiresMountsFor=/path/to/fs .
Few questions:
If you just run the script as the user, is the script able to perform write operations in the shared folder? – I assume yes?
Because if this works, there is no reason it will fail as systemctl service.
Or do you see problems writing at reboot stage?
If I have more information, I may try to replicate the behaviour in my environment.
I see there are lot of comments. Can you please consolidate and send me a mail
Thanks for the response and for taking a look at this, to answer your questions:
– Just running the service after I log in, everything works, I can write to the shared folder with the service.
– the really weird thing is that I have echo statements showing that when I run as root:
– I can write to the shared folder
– the script sees the files and directories via ls right after creation
– they go away at some point. there is no delete for these files anywhere, but some of them are accessed
by a java program that the script is calling. some are not. but they all disappear by the time I can log in
and look.
Thanks for sharing the additional information, I will not approve the script as that may be confidential.
Give me time till tomorrow, let me try to replicate this and come back. I am also little occupied with my office work.
I assume you are using samba for file sharing.
We can further communicate using your mail address. You can send mail to admin@golinuxcloud.com
First, Thanks a lot for this nice tutorial. This is what i am looking for.
But I faced a problem. In my one test VM, it works fine and then I have tried to do the same procedure in another machine (important vm) but the service has not started. I have tried to start the application manually it works fine (owner of statsup.sh is non-root user).
Then I commented out the User and Group in a Unit file under systemd and it works again. So I guess the problem is with the systemd service file. Kindly give me some idea what to do?
Thank you for your feedback.
Does if work if you try to start the application using the systemd service manually?
Did you checked “journalctl -b” logs for any hint?
One hint from Journalctl >> catalina.sh said permission denied (as my application call catalina.sh)
In my VM no tomcat service and owner of catalina.sh is root
but in my target machine (where i have problem) there is a tomcat service and its stopped and owner of catalina.sh is tomcat
And What does it mean to start the application using the systemd service manually? (i am a newbie)
Can you please give me any idea what to do?
I am not sure if I understand the scenario completely. On your target VM if your service is supposed to be started as root then you can remove the User and Group argument in the systemd unit file. The idea is to understand the requirement first, you mentioned that systemd service fails to start the service automatically so does that mean the service ends up being ‘dead’ or the service is not started at all.
Can the service use a domain user instead of the local user when running.
E.g We have a domain user that will have access to the MSSQL DB on some server
Our client machine is redhat linux on which tomcat is running as a service.
Our client machine is already added to the same domain as the MSSQL DB
The servlet in our tomcat needs to access the MSSQL DB
Instead of SQL Authentication, we want to use windows authentication for this purpose
Now how can we run the tomcat as the same domain user that has access to the MSSQL DB ?
You can just place the username in the User=USERNAME field without any domain details. For ex if your mysqldb user is dbadmin then just place User=dbadmin and it should work. Unless you also have a local user names dbadmin in which case there can be conflict so you will have to delete the local user.
How can I check whether we have systemd privileges or not ?
By default non root users don’t have privilege to use systemd to restart/start/stop services but they should have permission to check the status. You may try to restart any service such as sshd and if you don’t have privilege then the same should fail
Источник