是否可以在 /dev/tty1 上运行脚本并生成一个在 /dev/tty2 上运行的程序并等待它完成并运行脚本中的其他命令?例如:
echo "Hello, this is from terminal 1"
chvt 2
sh myprogram.sh (I want it to run on tty2, but it runs on tty1)
chvt 1
Run Code Online (Sandbox Code Playgroud)
myprogram.sh:
echo "Hello' this is from terminal 2, please type your input:"
read A
exit A
Run Code Online (Sandbox Code Playgroud) 我正在尝试与交互式流程进行沟通.我希望我的perl脚本成为用户和进程之间的"模块化人".该过程将文本放入stdout,提示用户输入命令,将更多文本放入stdout,提示用户输入命令,.......提供原始图形:
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
Run Code Online (Sandbox Code Playgroud)
以下模拟我正在尝试做的事情:
#!/usr/bin/perl
use strict;
use warnings;
use FileHandle;
use IPC::Open2;
my $pid = open2( \*READER, \*WRITER, "cat -n" );
WRITER->autoflush(); # default here, actually
my $got = "";
my $input = " ";
while ($input ne "") {
chomp($input = <STDIN>);
print WRITER "$input \n";
$got = <READER>;
print …Run Code Online (Sandbox Code Playgroud) Shell脚本能否确定用户是否在用户所使用的同一tty上运行图形界面?
也许这甚至不可能?
编辑:
当用户在与用户正在使用的同一tty上运行窗口管理器时,我实际上正在尝试编写一个显示GUI(通过使用zenity / yad)的shell脚本。否则,脚本将退回到普通的命令行界面。
我有以下程序从stdin读取用户输入:
var input string = ""
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
var b []byte = make([]byte, 1)
for {
input += string(b)
}
Run Code Online (Sandbox Code Playgroud)
我想在for循环中放置某种条件,以便当用户按下"enter"(例如)时可以"中断",或者当用户按下(退格键)时从字符串中删除一个char.但是,我无法弄清楚这两个键的字节数组或字符串表示是什么.我如何解决这个问题?输入只打印一个\ w和退格键修剪一个未定义的字符.
如果我跑步,systemctl我会得到很多 tty(见上文)。有什么办法可以限制这个数字,从而节省一些内存,因为显然我永远不需要这堆tty。
sys-devices-virtual-tty-ttya0.device loaded active plugged /sys/devices/virtual/tty/ttya0
[...]
sys-devices-virtual-tty-ttyzf.device loaded active plugged /sys/devices/virtual/tty/ttyzf
Run Code Online (Sandbox Code Playgroud) 我想通过 ssh 进入远程服务器,更改用户然后执行脚本。我正在subprocess这样做,但它似乎sudo -u userB -i没有改变用户。
HOST = 'remote_server'
USER = 'userA'
CMD = ' whoami; sudo -u userB -i; whoami'
ssh = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST),CMD],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if not result:
err = ssh.stderr.readlines()
print('ERROR: {}'.format(err))
else:
print "success"
print(result)
$ success
$ ['userA\n', 'userA\n']
Run Code Online (Sandbox Code Playgroud)
当我替换为 时CMD ='sudo -u userB -i && whoami',出现此错误:
错误:['sudo:抱歉,你必须有一个 tty 才能运行 sudo\n']
在终端上,我可以进行无密码 ssh, sudo -u userB -i && whoami
当输出通过管道传输到终端以外的其他地方时,我想禁用颜色。
我有一个写入stdout的perl脚本,这是一个tty.有没有办法确定该tty上的选项卡有多少个空格?
我有一个通过USB连接到Raspberry Pi的GPS模块.
出于某种原因,我似乎无法使用以下方法获得修复:
CGPS
它似乎没有得到修复并终止.
我也尝试过:
sudo killall gpsd
sudo gpsd/dev/ttyUSB0 -F /var/run/gpsd.sock
然后再次尝试cgps,但这似乎也不起作用.
我甚至尝试过:
sudo nano/etc/default/gpsd
并改变了这条线:
GPSD_OPTIONS = ""
至:
GPSD_OPTIONS = "的/ dev/ttyACM0"
这显然适用于网络上的其他人,但重启后,这也不起作用.
但出于某种原因我做的时候:
gpsmon/dev/ttyUSB0
我得到了完整的数据读数; lat,lon,Sats,altitude,ext.
有没有办法将gpsmon /dev/ttyUSB0句子输出到文本文件?
另外,为什么我不能使用cgps或类似的东西获得修复?
我正在尝试编写一个程序来执行系统的远程管理。为此,我发出 SSH 命令并通过管道以编程方式提供输入。我还捕获了他们的输出。
一些命令需要提升,所以我需要发出诸如ssh user@host "sudo apt-get install blah".
问题是,sudo除非在其标准输入上找到真正的终端,否则拒绝通过终端直接接受密码。有什么办法可以sudo让我愚蠢地允许这样做吗?