[Share Experiences] 用C++执行shell相关事宜
Tofloor
poster avatar
PrintfCow
deepin
2023-01-02 20:15
Author

Deepin20.8,由于上完课要传文件,搭了个FTP,现在想写个脚本,自动同步文件及设置权限,用的方法是 cstdlib头文件下的 system()命令,但是跨用户操作得有 su权,有大佬知道这个怎么获取吗?直接 system("sudo su")会报错...

cstdlib好像比较老了,或者有什么更简便、稳定的方法也请指出)

Reply Favorite View the author
All Replies
1 / 2
To page
PrintfCow
deepin
2023-01-02 20:30
#1
It has been deleted!
PrintfCow
deepin
2023-01-02 20:32
#2

如果改成 system("su"),那么会这样:

请输入密码:
验证成功
bash: 无法设定终端进程组(54888): 对设备不适当的 ioctl 操作
bash: 此 shell 中无任务控制

可以输入密码,但是输入后便不可执行任何操作,如chmod会输出:.........不允许的操作

Reply View the author
PrintfCow
deepin
2023-01-02 20:32
#3
It has been deleted!
PrintfCow
deepin
2023-01-02 20:33
#4
PrintfCow

如果改成 system("su"),那么会这样:

请输入密码:
验证成功
bash: 无法设定终端进程组(54888): 对设备不适当的 ioctl 操作
bash: 此 shell 中无任务控制

可以输入密码,但是输入后便不可执行任何操作,如chmod会输出:.........不允许的操作

这高亮会变成红色么...confused

Reply View the author
blue_whale
deepin
2023-01-02 20:36
#5

可以试试python语言的 pexpect

Reply View the author
donaldsebleung
deepin
2023-01-02 20:45
#6

你的 C++ 程序直接以 root 用户运行不就行了吗confused

Reply View the author
PrintfCow
deepin
2023-01-02 20:46
#7
donaldsebleung

你的 C++ 程序直接以 root 用户运行不就行了吗confused

sudo su
cd /......
./test

这么执行程序跟手动差不了多少joy

Reply View the author
PrintfCow
deepin
2023-01-02 20:52
#8
donaldsebleung

你的 C++ 程序直接以 root 用户运行不就行了吗confused

python只简单学过一点点,不知道咋用

Reply View the author
PrintfCow
deepin
2023-01-02 20:52
#9
It has been deleted!
PrintfCow
deepin
2023-01-02 20:52
#10
blue_whale

可以试试python语言的 pexpect

Python没咋学过,基础差不多忘没了...

Reply View the author
PrintfCow
deepin
2023-01-02 20:52
#11
It has been deleted!
donaldsebleung
deepin
2023-01-02 20:53
#12
PrintfCow
sudo su
cd /......
./test

这么执行程序跟手动差不了多少joy

直接 sudo /path/to/test 也行,就一个命令加上密码验证

如果你这个脚本需要长期运行或自启动(听说是个 FTP 服务器?),可考虑写个 systemd unit 文档,放到 /etc/systemd/system 目录下

Reply View the author
enforcee
deepin
2023-01-02 21:50
#13

我不知道楼主到底是怎么做的,给的信息实在有点少。正常来说应该没问题的,system也是调用的shell,可能是楼主的用法不对。

楼主可以试试 system ("sudo 命令; sudo 命令; sudo 命令");或者 system ("sudo bash -c '命令; 命令; 命令'");这样的写法,更漂亮的方法就是像楼上说的,用systemd去启动,还省得来回输入密码。

Reply View the author
安洛
deepin
2023-01-02 23:27
#14

楼上说得好,比较简单的方案是直接

sudo xxx

来执行你的程序。

或者利用systemd来更好地控制程序运行,如果你的程序有自动启动或者被其它程序调用这样的需求的话,用systemd无论如何都更加方便。

如果你不希望为整个程序赋予sudo权限,只希望针对特定的语句赋予sudo的话,那么从sudo的提示可以看出,你可以用sudo -S来从标准输入读取密码,所以:

如果是比较简单的语句,可以这样调用:

system("sudo -S 你的语句")

例如:

system("sudo -S apt update")

-S选项指示sudo从标准输入流(stdin)中读取用户密码。

如果是比较复杂的语句,你可以用bash包裹:

system("sudo -S bash -c '命令'")

这样会以管理员权限启动bash,然后在bash中执行后续指令。当然你用sh或者zsh也应该可以。

如果语句非常复杂,你还可以把命令写进脚本文件里然后调用。方法和上面类似。但是如果真是这样为什么你不直接写脚本呢?

最后,既然是从标准输入读取密码,还可以将密码硬编码进入程序中:

system("echo '你的密码' | sudo -S 你的命令")

如果你真的这么做了,记得妥善保管你的程序源代码和二进制,最好将权限设置为700,否则会导致严重的安全问题。

su命令明显不是为了在脚本或者程序中集成而设计的。这东西会切换到对应的用户并启动一个新shell,然后你的任务进程就进行不下去了……

Reply View the author
PrintfCow
deepin
2023-01-02 23:47
#15
It has been deleted!
PrintfCow
deepin
2023-01-02 23:47
#16
安洛

楼上说得好,比较简单的方案是直接

sudo xxx

来执行你的程序。

或者利用systemd来更好地控制程序运行,如果你的程序有自动启动或者被其它程序调用这样的需求的话,用systemd无论如何都更加方便。

如果你不希望为整个程序赋予sudo权限,只希望针对特定的语句赋予sudo的话,那么从sudo的提示可以看出,你可以用sudo -S来从标准输入读取密码,所以:

如果是比较简单的语句,可以这样调用:

system("sudo -S 你的语句")

例如:

system("sudo -S apt update")

-S选项指示sudo从标准输入流(stdin)中读取用户密码。

如果是比较复杂的语句,你可以用bash包裹:

system("sudo -S bash -c '命令'")

这样会以管理员权限启动bash,然后在bash中执行后续指令。当然你用sh或者zsh也应该可以。

如果语句非常复杂,你还可以把命令写进脚本文件里然后调用。方法和上面类似。但是如果真是这样为什么你不直接写脚本呢?

最后,既然是从标准输入读取密码,还可以将密码硬编码进入程序中:

system("echo '你的密码' | sudo -S 你的命令")

如果你真的这么做了,记得妥善保管你的程序源代码和二进制,最好将权限设置为700,否则会导致严重的安全问题。

su命令明显不是为了在脚本或者程序中集成而设计的。这东西会切换到对应的用户并启动一个新shell,然后你的任务进程就进行不下去了……

哇,谢谢!

本蒟oier表示佩服

Reply View the author
PrintfCow
deepin
2023-01-02 23:48
#17
donaldsebleung

直接 sudo /path/to/test 也行,就一个命令加上密码验证

如果你这个脚本需要长期运行或自启动(听说是个 FTP 服务器?),可考虑写个 systemd unit 文档,放到 /etc/systemd/system 目录下

谢谢,但是貌似不太用得着,虽然是FTP,但不是服务器,本地机器而已

Reply View the author
PrintfCow
deepin
2023-01-02 23:49
#18
enforcee

我不知道楼主到底是怎么做的,给的信息实在有点少。正常来说应该没问题的,system也是调用的shell,可能是楼主的用法不对。

楼主可以试试 system ("sudo 命令; sudo 命令; sudo 命令");或者 system ("sudo bash -c '命令; 命令; 命令'");这样的写法,更漂亮的方法就是像楼上说的,用systemd去启动,还省得来回输入密码。

好的,谢谢

Reply View the author
miaoaaa
deepin
2023-01-02 23:49
#19

可以用用pkexec,如果你有图形化的界面它会自动弹出窗口让你授权,比如system("pkexec rm /etc/xxx")

Reply View the author
miaoaaa
deepin
2023-01-02 23:50
#20
It has been deleted!
1 / 2
To page