如何在shell脚本中return到本地用户?

How to return to the local user in shell script?

我有 ubuntu 15.10 os。 我写了一个 shell 脚本来执行多个命令,它们是:

登录root"root@dalya-B5400:/home/hduser"进入snort目录,开启Ids模式,将抓包转化为文本格式,最后退出本目录和root,然后登录给 hadoop 用户“root@dalya-B5400:/home/hduser”,启动所有进程并将 snort 日志文件发送到 hadoop。

我的帐号是“hduser@dalya-B5400”,是普通用户。 我需要在该用户中执行一些命令:“root@dalya-B5400:/home/hduser”所以我使用了:$ sudo su 并登录到它。 完成这里的工作后,我想 return 普通用户“ hduser@dalya-B5400 ”

我的脚本一直有效,直到从 root 登录到 hadoop 用户,这里我关注一个问题,我使用了这个命令(一次一个):

$ su - & sshpass -p password ssh -o StrictHostKeyChecking=no hduser@dalya-B5400
$ sudo -iu hduser
$ sudo su - hduser

它已登录到 hadoop 用户,但之后退出而不执行其后面的其余命令。

我也尝试从当前调用第二个 shell 脚本,但它也给出相同的结果并且不打开普通用户。

我的主要 shell 脚本名为 snort-command,它包含以下内容:

#!/bin/bash
cd ~/snort5_src
cd snort-2.9.9.0
snort -dev -n 20 -l /home/hduser/log9 -b -c /etc/snort5/snort.conf
chmod a+rwx /home/hduser/log9/snort.log.*
tcpdump -n -tttt -r /home/hduser/log9/snort.log.* > /home/hduser/log9/bigfile2.txt
sshpass -p password ssh -o StrictHostKeyChecking=no hduser@dalya-B5400
/home/hduser/hadoop

第二个 shell 脚本名为 hadoop 并包含:

#!/bin/bash
/usr/local/hadoop/bin/start-all.sh
hadoop fs -put /home/hduser/log9/bigfile2.txt user/hduser/li

我还尝试从当前打开新终端:

$ gnome-terminal

但它也打开了当前用户而不是普通用户。

有什么建议吗?

我不是 100% 确定我正确理解了你的所有描述,但我认为你想说的是命令的远程部分没有发生? /home/hduser/hadoop 是你的第二个脚本吗?

如果是,这应该可以完成工作:

cd ~/snort5_src
cd snort-2.9.9.0
snort -dev -n 20 -l /home/hduser/log9 -b -c /etc/snort5/snort.conf
chmod a+rwx /home/hduser/log9/snort.log.*
tcpdump -n -tttt -r /home/hduser/log9/snort.log.* >         
/home/hduser/log9/bigfile2.txt
sshpass -p hadoop ssh -o StrictHostKeyChecking=no hduser@dalya-B5400 /home/hduser/hadoop

问题是你只是连接到远程机器,它对之后本地脚本中的内容一无所知:)

您可以通过 SSH 使用普通用户登录,然后以 root 身份执行命令(您需要确保您的普通用户在 sudoers 中),例如使用以下命令:

sshpass -p 'mynormaluserpassword' ssh -o StrictHostKeyChecking=no mostafa@remotehost "whoami && id ; echo 'mynormaluserpassword' | sudo -S sh -c 'whoami; id; echo Hello from root user'"

结果如下:

mostafa
uid=1033(mostafa) gid=1033(mostafa) groups=1033(mostafa)
[sudo] password for mostafa: root
uid=0(root) gid=0(root) groups=0(root)
Hello from root user

解释:

  1. 我使用名为 mostafa
  2. 的普通用户登录
  3. 我执行了 whomai 然后 id 打印了这些结果:

    mostafa uid=1033(mostafa) gid=1033(mostafa) groups=1033(mostafa)

  4. 我执行了另外 3 个命令 'whoami; id; echo Hello from root user' 但是使用 sudo 相当于 root 用户,结果如下:

    root

    uid=0(root) gid=0(root) groups=0(root)

    Hello from root user

此外,为了使用 sudo,我必须使用 echo 'mynormaluserpassword' | sudo -S 输入密码(除非您将其配置为无密码工作),然后我使用 sh -c 'whoami; id; echo Hello from root user' 传递我需要执行的所有命令它作为根。

所以你需要执行的任何root命令都可以在这里添加echo 'mynormaluserpassword' | sudo -S sh -c 'echo Hello from root user'"

我通过以下步骤解决了这个问题:

1- 将 sudo 添加到 snort 命令,无需登录到 root 用户,这样我以后就不需要注销了。

sudo snort -dev -n 20 -l /home/hduser/log9 -b -c /etc/snort5/snort.conf
sudo chmod a+rwx /home/hduser/log9/snort.log.*
sudo tcpdump -n -tttt -r /home/hduser/log9/snort.log.* > /home/hduser/log9/bigfile2.txt

并且 运行 它没有密码,将此行添加到 visudo :

hduser ALL=(ALL) NOPASSWD: ALL

2-此时它一直有效,直到我将文件发送到 hadoop,它给出的消息是:

nameNode in safe mode

我发现问题是因为 Job 在 namenode 启动后退出安全模式之前 运行ning。所以我在执行脚本前几分钟启动了 hadoop 进程,它运行良好。