如果我在手动执行每一行时取出循环和变量,不明白为什么我的代码有效。首先我认为我的变量是错误的,但后来我用变量测试了我的代码,但没有循环,它起作用了。
如果我回到循环中(我唯一要做的就是改变),我会得到这些奇怪的stty错误。
while read p; do
#Send file
scp random_file.txt $p:/me/folder"
#Log in
ssh $p"@myserver.txt"
#List file, extract file, append file
#Code here
#log out
exit
done <usernames.txt
我已经搜索了这个错误(这是一个非常常见的错误)令人作呕,但没有一个解决方案正在运行。禁用伪tty分配也不会强制伪tty分配为我工作。无论选项
,我总是会收到错误-t -t选项
tcgetattr: Inappropriate ioctl for device
-t选项
Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: : Invalid argument
-T选项
stty: : Invalid argument
那么我如何解决这些stty错误以及为什么当我将它放入循环时它会停止工作?
答案 0 :(得分:1)
<usernames.txt
的输入重定向正在用文件usernames.txt
替换标准输入。因此,终端不再是输入,导致这些错误。解决此问题的一种方法是使用标准输入以外的文件描述符,例如:
while read p <&3; do
…
done 3<usernames.txt
你遇到的另一个问题是循环中的命令是在本地执行的,而不是在远程机器上的ssh
上执行的,因此exit
将退出本地shell(从{{1返回后)通过手动注销)。您可以将命令放在ssh
命令行上远程执行(请参阅ssh
手册,或者,例如this question),这可能会消除您将终端作为标准输入的需要。第一名。
答案 1 :(得分:1)
ssh。脚本中的ssh不会这样做。当以这种方式编写脚本时,在ssh行之后的循环体是不在远程系统上发生。它发生在当地。
如果要在该ssh连接的上下文中运行远程计算机上的代码,则需要将其全部写为ssh
命令的命令参数和/或在远程计算机上编写脚本,将该脚本作为ssh命令参数执行。