- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在谷歌搜索很多,但我没有找到任何信息来帮助我完成我的任务。也许这是不可能的。我正在 Raspberry Pi 上使用 Raspbian 发行版,但我认为它与任何 bash 脚本编写都相关。
我已经创建了 udev 规则和一个 systemd 服务,当系统检测到插入 usb 的谷歌手机(例如插入 nexus 4、5 6P 等)时,它会执行我编写的 bash 脚本。这一切都有效。您插入手机,我的脚本将执行并使用 fastboot 获取设备产品名称,然后将适当的 twrp 镜像闪存到手机上的恢复分区(twrp 是为手机定制的恢复操作系统)。
如果我在终端手动执行 bash 脚本,您将进行用户交互。回显信息什么的。我有一个 5 秒倒计时计时器,让用户有机会在检测到设备后停止执行。这也行。
我的问题是:当脚本由 systemd 在它自己的虚拟终端或其他任何东西中执行时,如果您在控制台上,您将看不到脚本中的任何内容,并且脚本无法看到任何用户输入(例如击键)取消。
我想知道,如果您坐在我的脚本的控制台前,是否可以开始显示 5 秒倒计时警告并允许用户取消?
我目前在 headless 模式下设置了 raspberry pi,因此它可以启动到控制台,仅此而已。它不会启动任何图形环境。我通常通过 ssh 进入 raspberry PI 来使用它。因此,当我 ssh 进入并执行 w 命令时,我看到我的 tty 是/pts/0。
是否可以让我的脚本从当前控制台输出和读取任何击键?我希望这是有道理的。
我最终在我的脚本中创建了一个函数,我可以调用它来回显所有事件的、打开的 tty,但我不知道如何读入。而且我认为可能有一种更优雅的方式来实现我的目标我正在做提前感谢任何人可以提供的任何帮助或建议。我将在下面放置代码和输出。
保罗。
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pi tty1 18:22 1:08m 1.18s 0.92s -bash
pi pts/0 fe80::187c:321f: 18:49 1.00s 2.98s 0.05s w
我的 udev 规则
# Google
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE:="0666", GROUP:="plugdev", TAG+="systemd", ENV{SYSTEMD_WANTS}+="load-fastboot-flasher.service"
我的systemd服务单元文件
[Unit]
Description=Google Device TWRP Recovery
After=multi-user.target
[Service]
Type=idle
User=pi
ExecStart=/home/pi/fastboot-twrp/fastboot-twrp-flash.sh > /dev/null &
StandardOutput=console
[Install]
WantedBy=multi-user.target
最后是我的 bash 脚本
#!/bin/bash
######################################################################################
# Our function that performs the flash after a device was detected.
######################################################################################
fastboot-test() {
GOOGLEDEVICENAME=`fastboot getvar product 2>&1 | grep "product:" | awk '{print $2}'`
if [[ "$GOOGLEDEVICENAME" != "" ]]; then
echoall "Device Product_Name: $GOOGLEDEVICENAME"
if [ ! -d "$GOOGLEDEVICENAME" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
echoall "Error! Device folder & recovery image dont exist. Aborting!"
echoall ""
echoall "Please create a folder using the same product name as your device in the folder"
echoall "that this script resides in and place your twrp image in this new folder."
echoall "e.g. for a Nexus 4 make a folder called mako with your twrp image inside it."
echoall ""
exit 1
fi
cd $GOOGLEDEVICENAME
echoall "Selecting twrp image: " $PWD/twrp*
sleep 1
echoall ""
fastboot flash recovery $PWD/twrp*
echoall ""
echoall "twrp recovery image flash complete!"
echoall "Enjoy your fishing.... ;-)"
echoall ""
else
echoall "No connected Google devices"
fi
}
######################################################################################
# Our function to print output to all currently open consoles (e.g. type w a terminal to see users)
######################################################################################
echoall() {
for PTS in $(w |grep -o pts/.) ; do echo $1 $2 $3 >>/dev/$PTS; echo $1 $2 $3 >>/home/pi/load-fastboot-flasher.log; done
}
######################################################################################
# START
######################################################################################
#set +x
echoall ""
echoall "$(date)"
echoall ""
echoall "Google device detected. Press C then ENTER to cancel TWRP recovery flash in 5 seconds"
COUNT=5
while (( COUNT > 0 ))
#This is our 5 sec timer.
do
read -t 1 -n 1 -r
if [[ $REPLY == ^[Cc]$ ]]; then
Exit 0
fi
sleep 1
(( COUNT -- ))
echoall $COUNT
done
echoall ""
echoall ""
#set -x
DETECTED=`fastboot devices | awk '{print $2}'`
if [[ "$DETECTED" == "fastboot" ]]; then
#Save the current working directory
RESTOREPATH=`pwd`
#Change the current working directory to the directory that this script resides in
cd $(dirname $(readlink -f $0))
echoall "changed working directory to: "$PWD
echoall ""
#
echoall "Device detected: Yes"
fastboot-test
cd $RESTOREPATH
echoall "changed working directory to: "$PWD
echoall ""
echoall "### END TWRP FLASH ###"
echoall ""
for PTS in $(w |grep -o pts/.) ; do echo -ne '\n' >>/dev/$PTS; done
exit
else
echoall "Error! Fastboot not properly detecting Google device."
fi
最佳答案
答案很简单:你不能。如果可以,你不应该。
写入所有终端很容易; wall
会为你做这件事。但是,已经有一个进程读取您的终端输入,那就是您的 shell(bash
如果一切都是默认的)。因此,如果您希望第二个进程从同一个终端读取,您将遇到这样的问题,即您键入的某些字符将进入脚本,而另一些则进入 shell。也许一个例子可以说明问题:
您在 ssh session 中键入 rm -rf/a
并且电话已连接。几乎所有的东西都会被 shell 捕捉到,但是你的脚本会捕捉到 a
并且当你按下 enter 时,你会得到警告说对/进行递归操作是危险的。
您可能想探索其他选项;例如 dancer2 网络应用程序。
关于linux - Bash 脚本 - 从 Systemd 启动脚本时的用户交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44862337/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!