有时,迫不得已,我们需要在脚本中执行sudo或su命令,虽然这不安全,但切实可行。
sudo
sudo非常简单,因为其自己就可以:
1
| $ echo rootPass | sudo -S cmd
|
-S
代表从标准输入读取密码。
su
我们常用做法是su - root
,这时需要输入密码。要怎么在脚本中指定呢?稍微复杂一点。
方式1
1 2 3 4 5 6 7 8 9 10 11 12
| su - username <<! enterpasswordhere enter commands to run as the new user !
#
su - root <<! >/dev/null 2>&1 root-password whoami > /dev/tty ls > /dev/tty !
|
他是把结果输入到tty,也就是终端,如果我想获取结果呢?
可以写入临时文件:
1 2 3 4 5
| su - root <<! >/dev/null 2>&1 root-password whoami > /tmp/result ls > /tmp/result !
|
加入我采用的java程序链接ssh获取输出,这种方式可行:
1 2 3 4 5 6 7 8 9 10
| ShellExecutor executor = new ShellExecutor(ssh); String s = executor.execute("cd ~ && echo 'su - root <<! >/dev/null 2>&1' > su_temp.sh" + " && echo '$1' >> su_temp.sh" + " && echo 'cd $2' >> su_temp.sh" + " && echo '$3 > /tmp/result' >> su_temp.sh" + " && echo ! >> su_temp.sh" + " && sh su_temp.sh develop@2wsx#EDC@2019 /etc 'ls'" + " && rm -f su_temp.sh " + " && cat /tmp/result"); System.out.println(s);
|
方式2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/usr/bin/expect -f #Usage: script.sh cmd user pass
set cmd [lindex $argv 0]; set user [lindex $argv 1]; set pass [lindex $argv 2];
log_user 0 spawn su -c $cmd - $user expect "Password: " log_user 1 send "$pass\r" expect "$ "
|
运行:
1
| ./runas.sh "ls -l" bob 1234
|
参考
- Is there a single line command to do
su
?
- Run SU with password command line argument