如何在Python中自动化回车键以获取无密码Keystore证书详情
Problem Description
I'm trying to use subprocess to call keytool and get the certificate details of a Keystore, but I don't know the Keystore's password. When I run the code manually, pressing Enter twice allows the program to continue and output the results. Is there a way to automate this Enter key press in Python?
Here's the code I'm using:
import subprocess path = '/home/test/net.keystore' text = subprocess.Popen(['keytool', '-list', '-v', '-keystore', path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) file = text.stdout.read().decode().splitlines() print(file)
Solution
There are two reliable ways to handle this scenario:
1. Pass an empty password directly via keytool arguments
The simplest and most stable approach is to use the -storepass parameter to explicitly provide an empty password. This skips the interactive prompt entirely, so you don't need to simulate key presses at all.
Modified code:
import subprocess path = '/home/test/net.keystore' # Add -storepass with an empty string to bypass the password prompt process = subprocess.Popen( ['keytool', '-list', '-v', '-keystore', path, '-storepass', ''], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # Enables text mode, no need for manual decode() ) stdout, stderr = process.communicate() # Process the output as needed if stdout: print("Keystore details:") print(stdout.splitlines()) if stderr: print("Error messages:") print(stderr)
2. Simulate two Enter presses via subprocess input
If you need to stick to simulating the manual interaction, you can configure the subprocess to accept input via stdin and send two newline characters (\n\n) to mimic pressing Enter twice.
Modified code:
import subprocess path = '/home/test/net.keystore' # Enable stdin pipe to send input to the process process = subprocess.Popen( ['keytool', '-list', '-v', '-keystore', path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, text=True ) # Send two newlines to simulate pressing Enter twice stdout, stderr = process.communicate(input='\n\n') # Handle the output if stdout: print("Keystore details:") print(stdout.splitlines()) if stderr: print("Error messages:") print(stderr)
Recommendation
I'd strongly suggest using the first method (passing -storepass ''). It's more straightforward and less prone to issues if keytool changes its prompt text in future versions, whereas simulating interaction relies on the exact prompt behavior remaining consistent.
内容的提问来源于stack exchange,提问作者VJG

